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

b09cbbtk  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(184)

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

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

vertex_src = """
#version 330 core
in vec3 a_position;
in vec2 vTexcoords;
out vec2 fTexcoords;
void main() {
    gl_Position = vec4(a_position, 1.0);
    fTexcoords = vTexcoords;
}
"""

fragment_src = """
#version 330 core
out vec4 out_color;
in vec2 fTexcoords;

void main() {
    vec4 tempcolor = vec4(0.0);
    float ran = 0.003921568627451;
    for(int i = 0;i < 100;i++)
        tempcolor = tempcolor + ran*ran;
 
    out_color = tempcolor;
}
"""
# Routine calls for OpenGL setup...

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glDrawElements(GL_TRIANGLES, len(vertices) * 4, GL_UNSIGNED_SHORT,None)
buffer = glReadPixels(0, 0, 1280, 720, GL_RGB, GL_FLOAT,None)
print(buffer[1][1])

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

[0. 0. 0.]


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

import numpy as np
tempcolor = np.array([0.],dtype='float32')

ran = 0.003921568627451
for i in range(100):
    tempcolor = tempcolor + ran * ran;

out_color = tempcolor
print(out_color)


我得到了预期的输出

[0.00153787 0.00153787 0.00153787]


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

tempcolor += 0.002383698627451;


输出量:

[0.00392157 0.00392157 0.00392157]

pb3s4cty

pb3s4cty1#

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

相关问题