在片段着色器中组合两个纹理



我正在为我的游戏实现延迟着色。我已经将漫反射纹理渲染到渲染目标,并将照明渲染到渲染对象。我知道这两个都很好,因为我可以把它们直接呈现到屏幕上,没有任何问题。我想做的是在着色器中组合漫反射贴图和光照贴图来创建最终图像。这是我当前的片段着色器,它会导致黑屏。

#version 110
uniform sampler2D diffuseMap;
uniform sampler2D lightingMap;
void main()
{
    vec4 color = texture(diffuseMap, gl_TexCoord[0].st);
    vec4 lighting = texture(lightingMap, gl_TexCoord[0].st);
    vec4 finalColor = color;
    gl_FragColor = finalColor;
}

这不应该产生与直接绘制漫反射贴图相同的结果吗?

我用这种方法设置了采样器2d

void ShaderProgram::setUniformTexture(const std::string& name, GLint t) {
    GLint var = getUniformLocation(name);
    glUniform1i(var, t);
}
GLint ShaderProgram::getUniformLocation(const std::string& name) {
    if(mUniformValues.find(name) != mUniformValues.end()) {
        return mUniformValues[name];
    }
    GLint var = glGetUniformLocation(mProgram, name.c_str());
    mUniformValues[name] = var;
    return var;
}

编辑:更多信息。这是我使用着色器的代码。我设置了两个纹理,并绘制了一个空白的正方形供着色器使用。我确信,正如我之前所说,我的渲染目标正在工作,因为我可以像在这里一样使用相同的getTextureId来绘制它们。

    graphics->useShader(mLightingCombinedShader);
    mLightingCombinedShader->setUniformTexture("diffuseMap", mDiffuse->getTextureId());
    mLightingCombinedShader->setUniformTexture("lightingMap", mLightMap->getTextureId());
    graphics->drawPrimitive(mScreenRect, 0, 0);
        graphics->clearShader();

void GraphicsDevice::useShader(ShaderProgram* p) {
    glUseProgram(p->getId());
}
void GraphicsDevice::clearShader() {
    glUseProgram(0);
}

顶点着色器

#version 110 
varying vec2 texCoord;
void main() 
{ 
    texCoord = gl_MultiTexCoord0.xy;
    gl_Position = ftransform();
}

在GLSL版本110中,您应该使用:

texture2D(diffuseMap, gl_TexCoord[0].st); // etc.

而不仅仅是纹理函数。

然后要组合纹理,只需将颜色相乘,即

gl_FragColor = color * lighting;
glUniform1i(var, t);

glUniform函数会影响当前正在使用的程序。也就是说,调用glUseProgram的最后一个程序。如果要为特定程序设置统一,必须先使用它。

问题最终是我没有为正在绘制的屏幕矩形启用纹理坐标。

最新更新