目前我正在重写我的渲染以在任何情况下使用deferred着色,为此我还重写了3D着色器,并且我的目标是基于物理的着色。
现在发生了一些奇怪的事情,虽然它以前一直在工作并且仍在使用所有其他着色器,但统一变量不再像预期的那样工作了。如果我分配2个纹理两个不同的纹理槽,它总是只显示其中一个。
基本上我调用以下内容来绑定我的纹理:
glActiveTexture(slot); // slot is GL_TEXTURE0 = 0x84C0 + _TextureCount
glBindTexture(type, handle);
glUniform1i(uniform.Location, _TextureCount);
// Always passing, so the uniform is assigned to the right shader
Debug.Assert(_TextureCount == glGetUniformiv(_ShaderHandle, uniform.Location));
_TextureCount++;
OpenGL没有生成错误,并且所有统一位置都是正确的(检查每个位置!)。如果我在着色器中插入第三个纹理,则第一个仍然不可见,但第二个和第三个是。当然,如果我只使用一个纹理,纹理是可见的。此外它似乎不是纹理本身,都是RGB565,如果我切换它们加载的顺序总是最后一个工作。
这在某种程度上看起来像是一个错误,但是这个错误是完全新的,在切换到MRT之前着色器工作了。
varying vec3 vNormal;
varying vec2 vUV0;
varying mat3 vTangentToWorld;
uniform float uRoughness;
uniform float uMetallic;
uniform sampler2D uDiffuse;
uniform sampler2D uDiffuse2;
uniform sampler2D uNormals;
void PS_SHADER() // PS_SHADER is defined as main
{
vec4 diffuse = texture2D(uDiffuse2, vUV0) * uRoughness + (1 - uRoughness) * texture2D(uDiffuse, vUV0);
vec3 specular = (diffuse.xyz * uMetallic) + (uSpecular * (1 - uMetallic));
vec3 normalTexture = texture2D(uNormals, vUV0).rgb * 2.0 - 1.0;
vec3 normal = normalTexture * vTangentToWorld;
// Output the data into the deferred pipeline
// Color component
gl_FragData[0] = vec4((diffuse * (1 - uMetallic)).xyz, diffuse.a);
// Normal and roughness
gl_FragData[1] = vec4((normalize(normal) + 1) / 2, uRoughness);
// Specular component
gl_FragData[2] = vec4(specular, UNUSED);
}
捷运正在发挥作用。我生成一个帧缓冲区并附加4个纹理,以便渲染到绑定到GL_COLOR_ATTACHMENT0
到GL_COLOR_ATTACHMENT2
的纹理,当然我有一个GL_DEPTH_ATTACHMENT
。
在渲染之前,我绑定目标帧缓冲区(glBindFramebuffer(GL_FRAMEBUFFER, _FramebufferHandle)
),并仅使用颜色附件调用glDrawBuffers
。