我正在爲我的遊戲實現延遲着色。我已經將渲染目標渲染爲渲染目標,並且渲染了目標。我知道的兩個都很好,因爲我可以直接在屏幕上直接渲染它們,而不會出現任何問題。我想要做的是在着色器中結合漫反射貼圖和光照貼圖來創建最終圖像。這是我當前的片段着色器,它導致黑屏。在片段着色器中組合兩個紋理
#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();
}
在組合兩個紋理之前,請確保您可以獲得* 1 *紋理。 – 2012-02-10 20:54:57