opengl GLSL着色器未写入color_attatchment1

xkrw2x1b  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(169)

我正在尝试渲染到多个渲染目标,我设置了一个浮动纹理并将其绑定到COLOR_ATTACHMENT1。这一切都运行良好,缓冲区被正确创建和绑定。如果我让所有着色器都绘制到缓冲区,缓冲区甚至会被绘制到(glDrawBuffers(..)),而不仅仅是我设置的着色器(layout (location = 1) out ..)。问题是应该改变值的着色器没有改变。我知道这是使用Nsight图形预览COLOR_ATTATCHMENT1

(note左边的白色像素是来自nsight的边界)
正如我们所看到的,缓冲区有两次写操作,但都没有改变缓冲区。glClear不应该改变这里的任何东西(我认为),因为glDrawBuffers还没有包含这个缓冲区。如果我让每个着色器都写它(glDrawBuffers(..) //with both attatchments),COLOR_ATTATCHMENT1看起来会是这样的:

这些着色器根本不写入此附件(layout (location = 0) no location 1),并且工作正常,但同样,一个写入它的着色器不写入。板条箱应该写入白色像素,可以在此处看到它们:

(note:此屏幕截图已应用后期处理)
我不知道它写不写,但是其他的着色器都没有问题。帧缓冲区设置正确:

纹理的格式设置为GL_RGB32F,因为我希望它是一个带有视图空间法线的浮动纹理,但如果我使用GL_RGBRGBA,问题仍然存在。帧缓冲区是多重采样的,所有纹理都是多重采样的。下面是创建代码(省略glGen .....):

glBindFramebuffer(GL_FRAMEBUFFER, fboMultisample);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, colourTexMs); //..
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, sampleLevel, GL_RGB, windowWidth, windowHeight, GL_FALSE); //..
glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //..
glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //.. magnified ..
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depthTexMs);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, sampleLevel, GL_DEPTH_COMPONENT32, windowWidth, windowHeight, GL_FALSE); //..
glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //..
glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //..
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, normalTexMs);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, sampleLevel, GL_RGB32F, windowWidth, windowHeight, GL_FALSE); //..
glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //..
glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //..

这是附件代码(fboMultisampled仍绑定到GL_FRAMEBUFFER):

glBindTexture(GL_TEXTURE_2D, 0); //unbind textures for safety
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); //unbind textures for safety
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, colourTexMs, 0); //attatch textures to the framebuffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depthTexMs, 0); //..
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D_MULTISAMPLE, normalTexMs, 0); //.. 0 = mipmap level

这是应该写入COLOR_ATTATCHMENT1的着色器(省略了result计算):

layout (location = 0) out vec4 fragColor;
layout (location = 1) out vec3 viewNorm;
//..

void main()
{
    //..
    fragColor = vec4(result, 1.0f);
    viewNorm = vec3(1.f);
}

因此,简而言之,我不明白为什么着色器不写入COLOR_ATTATCHMENT1
注意:未报告任何OpenGL错误。

zd287kbt

zd287kbt1#

通过在着色器中输出vec4修复了此问题,即使纹理为rgb32F

相关问题