2012-02-10 62 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

相关问题