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