均匀变量没有正确的纹理

时间:2014-07-31 14:54:43

标签: opengl

目前我正在重写我的渲染以在任何情况下使用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);
}

MRT设置

捷运正在发挥作用。我生成一个帧缓冲区并附加4个纹理,以便渲染到绑定到GL_COLOR_ATTACHMENT0GL_COLOR_ATTACHMENT2的纹理,当然我有一个GL_DEPTH_ATTACHMENT

在渲染之前,我绑定目标帧缓冲区(glBindFramebuffer(GL_FRAMEBUFFER, _FramebufferHandle)),并仅使用颜色附件调用glDrawBuffers

0 个答案:

没有答案