2012-02-10 67 views
0

我正在爲我的遊戲實現延遲着色。我已經將渲染目標渲染爲渲染目標,並且渲染了目標。我知道的兩個都很好,因爲我可以直接在屏幕上直接渲染它們,而不會出現任何問題。我想要做的是在着色器中結合漫反射貼圖和光照貼圖來創建最終圖像。這是我當前的片段着色器,它導致黑屏。在片段着色器中組合兩個紋理

#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(); 

} 
+2

在組合兩個紋理之前,請確保您可以獲得* 1 *紋理。 – 2012-02-10 20:54:57

回答

0

問題最終導致我沒有爲我正在繪製的屏幕矩形啓用紋理座標。

1

在GLSL版本110,你應該使用:

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

而不只是紋理的功能。

然後到紋理相結合,正好乘的顏色放在一起,即

gl_FragColor = color * lighting; 
+0

仍然是黑屏:( – rcapote 2012-02-10 20:59:41

+0

)你還沒有真正給我們足夠的信息來幫助你理清這個問題,雖然當你得到一個紋理時,顏色的乘法應該可以工作 – SuperMaximo93 2012-02-10 21:02:05

+0

好吧,我添加了一些更多的信息給我的操作,但不知道提供什麼信息。由於着色器似乎沒問題,問題一定是將紋理傳遞給着色器?難道是我無法將VBO紋理傳遞給shader? – rcapote 2012-02-10 21:14:39

0
glUniform1i(var, t); 

glUniform功能影響程序,它是目前使用。也就是glUseProgram被調用的最後一個程序。如果您想爲特定程序設置制服,則必須先使用它。

+0

是的,我使用程序後設置了數值。 – rcapote 2012-02-10 20:59:33

相關問題