c++ - 如何正确显示 CPU 上处理的噪声
问题描述
我尝试使用 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));
}
}
此代码产生一个黑色矩形并且速度很慢。怎么了?
解决方案
噪声数据必须作为浮点数而不是双精度数发送到 glTexSubImage2D。此外,这是避免多次绘制调用的解决方案。
array<float,3> pixel;
array<array<array<float,3>,500>,500> data;
float noise;
for (int x=0; x<500; ++x)
{
for (int y=0; y<500; ++y)
{
noise = float(noisePtr->noise2D(x, y));
pixel[0] = noise; // r
pixel[1] = noise; // g
pixel[2] = noise; // b
data[x][y] = pixel;
}
}
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,500,500,GL_RGB,GL_FLOAT,&data);
推荐阅读
- python - CNN:为什么我用 logits 或 softmax 层测量准确度没有区别?
- android - 在首选项中激活功能并动态添加选项卡
- crystal-reports - SAP Crystal Report中如何去掉竖线
- python - 有条件地改变列
- javascript - 淘汰 observableArray remove 导致错误并无法删除
- cluster-computing - slurm - pam_slurm_adopt 中的 action_unknown
- java - NamedNativeQuery 在具有 FK 的实体上抛出无效的列名异常
- python - Anaconda Tensorflow 运行时问题
- testing - 试图将我们的手动测试计划自动填充到 TFS 中的每个构建/迭代中?
- graphql - GraphQL 嵌套变异的问题