我正在为我的游戏实施延迟着色。我已将漫反射贴图渲染到渲染目标,并且我将渲染渲染到渲染目标。我所知道的都很好,因为我可以毫无问题地将它们直接渲染到屏幕上。我想要做的是在着色器中结合漫反射贴图和光贴图来创建最终图像。这是我当前的片段着色器,导致黑屏。
#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();
}
答案 0 :(得分:1)
在GLSL版本110中,您应该使用:
texture2D(diffuseMap, gl_TexCoord[0].st); // etc.
而不仅仅是纹理功能。
然后组合纹理,只需将颜色相乘,即
gl_FragColor = color * lighting;
答案 1 :(得分:0)
glUniform1i(var, t);
glUniform
函数会影响当前正在使用的程序。也就是说,glUseProgram
被调用的最后一个程序。如果要为特定程序设置制服,则必须先使用它。
答案 2 :(得分:0)
问题最终是因为我没有为我正在绘制的屏幕矩形启用纹理坐标。