【问题标题】:How to correctly display noise processed on the CPU如何正确显示 CPU 上处理的噪声
【发布时间】: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-&gt;noise2D(x, y)返回的数据有哪些范围?您的代码似乎假定为 [0, 255]。 data[0] = noise;(double 到 uint8 的转换)基本上只保留下一个最小的整数并丢弃小数部分。另请注意,对于 255 的值,转换未定义。
  • 感谢您的帮助 BDL。 noisePtr->noise2D(x, y) 返回从 0 到 1 的双精度值。
  • 回复。 "noisePtr-&gt;noise2D(x, y) returns double ranging from 0 to 1":这是否意味着您的int8_t[3] rgb 表示总是黑色或(偶尔)“非常接近”黑色?抱歉,如果我遗漏了什么。
  • 每个像素调用一个驱动程序,嗯?我不喜欢这样,特别是因为您调用的函数是专门为避免这种情况而设计的。
  • 在将噪声转换为整数之前将噪声乘以 255.0,最好在您自己的内存数组中执行此操作,然后作为整个纹理传递,而不是为了速度而逐个纹理设置它...

标签: c++ opengl noise


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2018-12-31
    • 2019-06-27
    • 2014-06-10
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多