opengl 无法从片段着色器输出中获取精确的浮点值[已关闭]

b09cbbtk  于 2024-01-07  发布在  其他
关注(0)|答案(1)|浏览(236)

**已关闭。**此问题需要debugging details。目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答问题。
上个月关门了。
Improve this question
我在桌面上使用OpenGL(使用PyOpenGL)进行一些图像处理操作,并在片段着色器中对每个像素进行一些浮点运算。之后,当我使用glReadPixels缓冲区读取像素时,并不像预期的那样。
下面是相关代码的部分:

  1. vertex_src = """
  2. #version 330 core
  3. in vec3 a_position;
  4. in vec2 vTexcoords;
  5. out vec2 fTexcoords;
  6. void main() {
  7. gl_Position = vec4(a_position, 1.0);
  8. fTexcoords = vTexcoords;
  9. }
  10. """
  11. fragment_src = """
  12. #version 330 core
  13. out vec4 out_color;
  14. in vec2 fTexcoords;
  15. void main() {
  16. vec4 tempcolor = vec4(0.0);
  17. float ran = 0.003921568627451;
  18. for(int i = 0;i < 100;i++)
  19. tempcolor = tempcolor + ran*ran;
  20. out_color = tempcolor;
  21. }
  22. """
  23. # Routine calls for OpenGL setup...
  24. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  25. glDrawElements(GL_TRIANGLES, len(vertices) * 4, GL_UNSIGNED_SHORT,None)
  26. buffer = glReadPixels(0, 0, 1280, 720, GL_RGB, GL_FLOAT,None)
  27. print(buffer[1][1])

字符串
print语句打印所有的0

  1. [0. 0. 0.]


如果我在Python中执行如下操作,

  1. import numpy as np
  2. tempcolor = np.array([0.],dtype='float32')
  3. ran = 0.003921568627451
  4. for i in range(100):
  5. tempcolor = tempcolor + ran * ran;
  6. out_color = tempcolor
  7. print(out_color)


我得到了预期的输出

  1. [0.00153787 0.00153787 0.00153787]


这是不是和fragment shader的输出精度有关?我希望fragment shader的所有操作都是float32精度,输出也是float32
在片段着色器中,如果我在for循环后添加以下语句,我会得到一些非零输出

  1. tempcolor += 0.002383698627451;


输出量:

  1. [0.00392157 0.00392157 0.00392157]

pb3s4cty

pb3s4cty1#

问题是帧缓冲区的内部格式,如果帧缓冲区每个颜色通道只有8位,那么你得到的值就不能比这更精确了。注意,默认帧缓冲区的格式不能更改,因为它是用OpenGL窗口创建的。通常情况下,默认帧缓冲区的格式是固定的规格化格式,其只能存储0.0到1.0范围内的值(与位深度无关)。
但是,您可以渲染到命名的帧缓冲区中。创建帧缓冲区时,可以指定格式和类型。请参见Framebuffer Object

相关问题