【发布时间】:2021-12-26 03:30:52
【问题描述】:
我尝试使用 C++/OpenGL 显示我在 CPU 上处理的 Perlin 噪声。 为此,我使用 glTexSubImage2D 在辅助帧缓冲区上绘制噪声,然后将其显示在全屏四边形上。
在这里,我循环遍历纹理像素并为每个 x、y 位置生成噪声值。然后我将噪声值(介于 0 和 1 之间的双精度值)定义为每个纹素的 RGB 值。
uint8_t data[3];
double noise;
for (int x=0; x<200; ++x)
{
for (int y=0; y<100; ++y)
{
noise = noisePtr->noise2D(x, y);
data[0] = noise; // r
data[1] = noise; // g
data[2] = noise; // b
GLCall(glTexSubImage2D(GL_TEXTURE_2D,
0,
x,
y,
1,
1,
GL_RGB,
GL_UNSIGNED_BYTE,
data));
}
}
此代码生成一个黑色矩形并且速度很慢。怎么了?
【问题讨论】:
-
noisePtr->noise2D(x, y)返回的数据有哪些范围?您的代码似乎假定为 [0, 255]。data[0] = noise;(double 到 uint8 的转换)基本上只保留下一个最小的整数并丢弃小数部分。另请注意,对于 255 的值,转换未定义。 -
感谢您的帮助 BDL。 noisePtr->noise2D(x, y) 返回从 0 到 1 的双精度值。
-
回复。
"noisePtr->noise2D(x, y) returns double ranging from 0 to 1":这是否意味着您的int8_t[3]rgb 表示总是黑色或(偶尔)“非常接近”黑色?抱歉,如果我遗漏了什么。 -
每个像素调用一个驱动程序,嗯?我不喜欢这样,特别是因为您调用的函数是专门为避免这种情况而设计的。
-
在将噪声转换为整数之前将噪声乘以 255.0,最好在您自己的内存数组中执行此操作,然后作为整个纹理传递,而不是为了速度而逐个纹理设置它...