Opengl GLSL延迟渲染只能输出RGBA

Opengl GLSL延迟渲染只能输出RGBA,opengl,glsl,deferred-rendering,Opengl,Glsl,Deferred Rendering,我尝试进行一些阴影处理,但着色器仅在使用以下选项时输出值: layout (location = 0) out vec4 outColor; 它不适用于vec3或更低版本。 您可以在此处检查我的纹理属性: shadowTextureProperties.setHasMipMap(false); shadowTextureProperties.setMagFilter(EnumTextureFilter.NEAREST); shadowTextureProperties.

我尝试进行一些阴影处理,但着色器仅在使用以下选项时输出值:

layout (location = 0) out vec4 outColor;
它不适用于vec3或更低版本。 您可以在此处检查我的纹理属性:

    shadowTextureProperties.setHasMipMap(false);
    shadowTextureProperties.setMagFilter(EnumTextureFilter.NEAREST);
    shadowTextureProperties.setMinFilter(EnumTextureFilter.NEAREST);
    shadowTextureProperties.setWrapS(EnumTextureWrap.CLAMP_TO_EDGE);
    shadowTextureProperties.setWrapT(EnumTextureWrap.CLAMP_TO_EDGE);
    shadowTextureProperties.setInternalColorFormat(EnumTextureColorFormat.RGB_32F); // 1st format value
    shadowTextureProperties.setSrcColorFormat(EnumTextureColorFormat.RGB); // 2nd format value
    shadowTextureProperties.setValueFormat(EnumValueFormat.FLOAT);
这是我的着色器片段源代码,带有vec3输出和上面的格式,我得到了一个完全白色的屏幕。使用vec4,我得到了真实的深度值

#version 400
precision highp float;
layout (location = 0) out vec3 outColor;

void main()
{
    outColor = vec3(gl_FragCoord.z);
}
结果

对于vec3:

对于vec4:

我知道这里可能会发生什么,这与混合有关。如果将此着色器的
vec3
版本重新写入
vec3(gl_FragCoord.z*gl_FragCoord.z)
,是否会更改输出?我尝试过,但没有更改。。。有了vec4,我得到了一个输出。好吧,这就不碍事了。。。有没有什么特别的原因让你想要一个3通道的颜色纹理来存储你的深度?您正在跨3个通道复制深度,每个通道32位。您可以使用浮点深度附件,完全避免这个问题。具有颜色可渲染32位浮点纹理支持的任何内容也将支持
GL\u DEPTH\u COMPONENT32F
。至少,您可以使用单个组件的颜色格式
GL_R32F
我知道这里可能会发生什么,这与混合有关。如果将此着色器的
vec3
版本重新写入
vec3(gl_FragCoord.z*gl_FragCoord.z)
,是否会更改输出?我尝试过,但没有更改。。。有了vec4,我得到了一个输出。好吧,这就不碍事了。。。有没有什么特别的原因让你想要一个3通道的颜色纹理来存储你的深度?您正在跨3个通道复制深度,每个通道32位。您可以使用浮点深度附件,完全避免这个问题。具有颜色可渲染32位浮点纹理支持的任何内容也将支持
GL\u DEPTH\u COMPONENT32F
。至少,您可以使用单个组件的颜色格式<代码>德国劳埃德船级社R32F