GL_32F和glReadPixels

时间:2017-02-19 09:03:45

标签: c++ opengl glsl

在OpenGL中,我试图将一个未缩放的浮点数从我的片段着色器输出到FBO颜色附件,以便鼠标选择值。但是我无法获取片段着色器代码以正确写入值。

我添加了一个颜色附件,用于将拾取值存储到我绘制的帧缓冲区中,如下所示:

// ... Bind FBO .etc.
glTexImage2D(
    GL_TEXTURE_2D,
    0,
    GL_R32F,
    DrawTextureDims.width(),
    DrawTextureDims.height(),
    0,
    GL_RED,
    GL_FLOAT,
    0);
glFramebufferTexture2D(
    GL_FRAMEBUFFER,
    GL_COLOR_ATTACHMENT2,
    GL_TEXTURE_2D,
    pointsMeshData->magnitudeTexture,
    0);

在绘图之前设置绘制缓冲区,如下所示:

    // ...
    GLenum drawBufs[2] {
        GL_COLOR_ATTACHMENT0,
        GL_COLOR_ATTACHMENT2
    };
    glDrawBuffers(2,drawBufs);

    GLfloat clearMagnitude[4] { 0,0,0,0 };
    glClearBufferfv(GL_COLOR,1,clearMagnitude);

    // Bind VAO and shader. Setup uniforms and call glDrawElements()

最后回读如下:

...
glBindFramebuffer(GL_READ_FRAMEBUFFER,drawData->renderFBO.handle());
glReadBuffer(GL_COLOR_ATTACHMENT2);
glBindBuffer(GL_PIXEL_PACK_BUFFER,0);

*magnitude = 0.f;
glReadPixels(x,y,1,1,GL_RED,GL_FLOAT,magnitude);
...

然而,当我使用以下片段着色器输出到第二颜色附件时,不会绘制任何内容。我从glReadPixels()

中找回我清除的颜色(clearMagnitude)
#version 330

in float scale;
uniform sampler1D uPalette;
layout(location=0) out vec4 color;
layout(location=1) out float oScale;

void main(void)
{
    color = texture(uPalette,scale);
    oScale = scale;
}

另一方面,当我使用以下(明确错误的)片段着色器输出时,我在glReadPixels()中得到一个缩放(0-1)值:

#version 330

in float scale;
uniform sampler1D uPalette;
layout(location=0) out vec4 color;
layout(location=1) out vec4 oScale;

void main(void)
{
    color = texture(uPalette,scale);
    oScale = vec4(scale,scale,scale,1);
}

我做错了什么?如何在GLSL中输出和读回单个未缩放的浮点数?

1 个答案:

答案 0 :(得分:2)

  

我使用以下(明显错误的)片段着色器输出

片段着色器没有任何问题。与顶点属性一样,片段着色器输出组件计数不必与实际目标图像的组件计数相匹配。如果输出图像的组件数少于相应的片段着色器变量,那么它将只采用与图像匹配的组件而忽略其余组件。

但是,您不能 输出tableView.registerNib(UINib(nibName: "Your Nib Name", bundle: nil), forCellWithReuseIdentifier: "Your Cell Identifier") 只是为了写入单个频道图像。您的vec4示例应该可以正常运行,因此可能存在驱动程序错误。

至于缩放问题,这是另一件事的错误:read color clamping。您必须使用float告诉OpenGL不要限制浮点读取。像这样:

glClampColor

这样可以在读取具有定点格式的FBO附加图像时防止夹紧。

这不是FBO州的一部分;它只是一个上下文值。所以你可以设置一次而忘记它。