在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中输出和读回单个未缩放的浮点数?
答案 0 :(得分:2)
我使用以下(明显错误的)片段着色器输出
片段着色器没有任何问题。与顶点属性一样,片段着色器输出组件计数不必与实际目标图像的组件计数相匹配。如果输出图像的组件数少于相应的片段着色器变量,那么它将只采用与图像匹配的组件而忽略其余组件。
但是,您不能 输出tableView.registerNib(UINib(nibName: "Your Nib Name", bundle: nil), forCellWithReuseIdentifier: "Your Cell Identifier")
只是为了写入单个频道图像。您的vec4
示例应该可以正常运行,因此可能存在驱动程序错误。
至于缩放问题,这是另一件事的错误:read color clamping。您必须使用float
告诉OpenGL不要限制浮点读取。像这样:
glClampColor
这样可以在读取具有定点格式的FBO附加图像时防止夹紧。
这不是FBO州的一部分;它只是一个上下文值。所以你可以设置一次而忘记它。