生成高质量纹理实时 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
是纹理的最大高度
现在的问题是这个方法很慢。我怎样才能使它足够快以实时完成,以便立即反映对 heightl
或 heghtg
的更改。 heightl 和 heightg 用于每个纹理。
这些纹理最高可达 4K 4096X4096
在顶点和片段着色器之间使用可变变量。单个浮点值就足够了,因为您只对高度坐标感兴趣。
除此之外,在片段着色器中为您的纹理引入 5 个统一变量,并在 GPU 上进行计算。
更详细:
对于每个片段,您在片段着色器中获得当前网格的插值高度值。根据高度值,您只需 select 来自所需纹理的样本并将该颜色输出。
我有一个程序地形生成应用程序。现在我想根据高度为地形生成纹理。
假设我现在为每个像素获得了 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
是纹理的最大高度
现在的问题是这个方法很慢。我怎样才能使它足够快以实时完成,以便立即反映对 heightl
或 heghtg
的更改。 heightl 和 heightg 用于每个纹理。
这些纹理最高可达 4K 4096X4096
在顶点和片段着色器之间使用可变变量。单个浮点值就足够了,因为您只对高度坐标感兴趣。
除此之外,在片段着色器中为您的纹理引入 5 个统一变量,并在 GPU 上进行计算。
更详细:
对于每个片段,您在片段着色器中获得当前网格的插值高度值。根据高度值,您只需 select 来自所需纹理的样本并将该颜色输出。