无法从片段着色器输出中获取精确的浮点值

问题描述 投票:0回答:1

我在桌面上使用 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])

打印语句打印全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]  

这与片段着色器的输出精度有关吗?我希望片段着色器中的所有操作都以

float32
精度完成,并且输出也将是
float32

只是添加,在片段着色器中,如果我在 for 循环之后添加以下语句,我会得到一些非零输出

tempcolor += 0.002383698627451;  

输出:

[0.00392157 0.00392157 0.00392157]  
python opengl floating-point fragment-shader pyopengl
1个回答
0
投票

有2个问题:

  1. 帧缓冲区的内部格式。如果帧缓冲区每个颜色通道只有 8 位,则您获得的值不可能比这更精确。请注意,默认帧缓冲区的格式无法更改,因为它是使用 OpenGL 窗口创建的。但是,您可以渲染到命名的帧缓冲区中。创建帧缓冲区时,可以指定格式和类型。请参阅帧缓冲区对象

  2. glReadPixels
    的第6个参数指定了你取出的像素数据的数据类型。如果您想要 float-32,则必须使用
    GL_FLOAT
    而不是
    GL_UNSIGNED_SHORT

© www.soinside.com 2019 - 2024. All rights reserved.