首页 > 解决方案 > 如何正确显示 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));
        }
      }

此代码产生一个黑色矩形并且速度很慢。怎么了?

标签: c++openglnoise

解决方案


噪声数据必须作为浮点数而不是双精度数发送到 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);

推荐阅读