生成高质量纹理实时 C++

Generate High Quality textures Realtime C++

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

假设我现在为每个像素获得了 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 returns 某点的网格高度。 t.sampleR() returns unsigned char 纹理的红色像素值 (i, j).

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

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

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

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

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

更详细:

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