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

标签 c++ opengl glsl

我正在努力为我的游戏实现延迟着色。我已将漫反射纹理渲染到渲染目标,并将光照渲染到渲染目标。我知道这两者都很好,因为我可以毫无问题地将它们直接渲染到屏幕上。我想要做的是在着色器中结合漫反射贴图和光照贴图来创建最终图像。这是我当前的片段着色器,它会导致黑屏。

#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;
}

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

我用这个方法设置了sampler2d

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;

关于c++ - 在片段着色器中组合两个纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9234547/

相关文章:

c++ - c++ 一个函数返回两个值

c++ - 有没有办法从 map::find() 获得 boost::optional 结果?

c++ - 需要帮助查找 undefined symbol

java - token 语法错误 'class' @ expected [JAVA - LWJGL]

opengl - 多重采样如何适用于整数纹理

c++ - VBO 和 glTranslatef 是否需要将 GLSL 着色器中的 gl_vertex 与某些东西相乘?

math - 对于平滑步长函数 glsl,edge0 大于或等于 edge1 是什么情况

c++ - 在运行时检查 C++ 共享依赖项(ldd on self)

GLSL 优化。什么更快?

opengl - 如何在立方体上获得平坦的法线