2012-02-10 8 views
0

私は自分のゲームに遅延シェーディングを実装しようとしています。拡散テクスチャをレンダリングターゲットにレンダリングし、レンダリングターゲットにレンダリングされた照明を持っています。どちらも私が知っているので、問題なく画面にまっすぐに表示できるので、問題ありません。私がしたいことは、拡散マップとライトマップの両方をシェーダで結合して最終的な画像を作成することです。ここに私の現在のフラグメントシェーダがあります。その結果、黒い画面になります。フラグメントシェーダで2つのテクスチャを組み合わせる

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

拡散マップをまっすぐ上に描画するのと同じ結果になるべきではありませんか?

私はこの方法

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

EDITでsampler2dを設定します。いくつかのより多くの情報。ここでシェーダを使用するコードを示します。 2つのテクスチャを設定し、シェーダが使用するための空白の四角形を描きます。私がここでやったのと同じgetTextureIdを使って上手く描くことができるので、私が前に言ったように、私のレンダーターゲットが動作していることは確かです。 GLSLバージョンあなたが使うべき110で

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

2つのテクスチャを組み合わせる前に、* 1つのテクスチャを使用できることを確認してください。 –

答えて

0

問題は、私が描いていた画面矩形のテクスチャ座標を有効にしなかったことに終わりました。

1

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

だけではなく、テクスチャ関数の。その後、

そして、ちょうどglUniform機能は、現在使用中のあるプログラムに影響を与える、すなわち

gl_FragColor = color * lighting; 
+0

まだ黒い画面:( – rcapote

+0

この問題を解決するために十分な情報を与えられていないのですが、テクスチャが表示されたら、色の乗算はうまくいくはずです – SuperMaximo93

+0

私の操作にいくつかの情報を追加しましたが、どの情報を提供するのかは本当にわかりません。シェーダは問題ないと思われます。 shader? – rcapote

0
glUniform1i(var, t); 

、一緒に色を掛け、テクスチャを結合します。すなわち、glUseProgramが呼び出された最後のプログラムです。特定のプログラムの制服を設定する場合は、まずそれを使用する必要があります。

+0

ええ、私はプログラムを使用した後に値を設定します。 – rcapote

関連する問題