【问题标题】:Generate High Quality textures Realtime C++生成高质量纹理实时 C++
【发布时间】:2021-12-07 14:47:51
【问题描述】:

我有一个程序地形生成应用程序。现在我想根据高度为地形生成纹理。

假设我现在有 5 个不同高度级别的纹理,对于每个像素,我计算它在网格上的位置,然后获取它的高度,然后决定从哪个纹理中采样。

注意纹理始终是正方形。

在代码中会是这样的:

for (int i = 0; i < resolution; i++) {
    for (int j = 0; j < resolution; j++) {
        tex[i * resolution* 3 + j * 3 + 0] = SampleTextureR(i, j);
        tex[i * resolution* 3 + j * 3 + 1] = SampleTextureG(i, j);
        tex[i * resolution* 3 + j * 3 + 2] = SampleTextureB(i, j);
    }
}

现在SampleTextureR(i, j) 就像:

for(TextureData* t : txtures){
 if(t.heightl > GetMeshElevation(i, j) && t.heightg < GetMeshElevation(i, j))
  return t.sampleR(i, j);
}
return 0;

GetMeshElevation 返回某个点的网格高度。 t.sampleR() 返回unsigned char(i, j)处纹理红色像素的值。

heightl 是纹理的最小高度 heightg 是纹理的最大高度

现在的问题是,这是一种非常缓慢的方法。我怎样才能使它足够快以实时完成,以便立即反映对heightlheghtg 的更改。 heightl 和 heightg 适用于每个纹理。

这些纹理最高可达 4K 4096X4096

【问题讨论】:

    标签: c++ opengl optimization textures


    【解决方案1】:

    在顶点着色器和片段着色器之间使用可变变量。一个浮点值就足够了,因为您只对高度坐标感兴趣。

    除此之外,在片段着色器中为您的纹理引入 5 个统一变量并在 GPU 上进行计算。

    更详细的:

    对于您在片段着色器中获得的每个片段,当前网格的插值高度值。根据高度值,您只需从所需纹理中选择样本并将该颜色输出即可。

    【讨论】:

    • 其实我认为我需要在cpu端处理纹理,因为这不仅仅是为了显示,还应该烘焙并保存为png或其他格式
    • 还有一件事我以 5 为例,它是可变的,所以如果我按照你的方法,你将无法在 E 到 gpu 限制期间获得超过 32 个纹理
    • @JaysmitoMukherjee 计算“之后”做什么并不重要,去那里的路是我们正在讨论的。 GL_MAX_TEXTURE_IMAGE_UNITS (glGetIntegerv) 告诉您一次可以使用多少个纹理单元(参见khronos.org/opengl/wiki/Shader#Resource_limitations)。
    • @JaysmitoMukherjee 顺便说一句。如果您想进一步处理图像,还可以渲染成纹理。
    • 我想我会选择第二个想法
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多