2016-11-26 10 views
1

シャドーマッピングを動作させようとしていましたが、失敗しました。今はフレームバッファに何かを書き込もうとしていますそれをテクスチャとしてクワッドにレンダリングします。私はこの小さなコードを10時間見ていましたので、最終的にいくつかの助けを求める時間になると思いました。何か情報が必要な場合や何かが不明な場合はお知らせください。OpenGL - フレームバッファに書き込むことができない(または正しく読み込む)

私はこれに続き、tutorialから始めました。それを2回完了した後、私はあきらめて3回目に貼り直して、別の場所で情報を探すようになりました。私の現在のコードはちょっと混乱していますが、重要なことを抽出しようとしました

ここでは、TEXTURE2D(_shadowMapと_shadowMapFBOはメインプログラムとして動作するクラスのプライベート変数です) :

glGenTextures(1, &_shadowMap); 
glBindTexture(GL_TEXTURE_2D, _shadowMap); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); 

glGenFramebuffers(1, &_shadowMapFBO); 
glBindFramebuffer(GL_FRAMEBUFFER, _shadowMapFBO); 
glDrawBuffer(GL_NONE); 
glReadBuffer(GL_NONE); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, _shadowMap, 0); 
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
{ 
    std::cout << "Frame buffer failed" << std::endl; 
    system("pause"); 
    exit(1); 
} 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

私は、最初のメインループでパスを描画します:

glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT); 
glBindFramebuffer(GL_FRAMEBUFFER, _shadowMapFBO); 
glClear(GL_DEPTH_BUFFER_BIT); 
_shadowShader.bind(); 
glBindVertexArray(_cubeVAO); 
glDrawElements(GL_TRIANGLES, _numberOfIndicesCube, GL_UNSIGNED_SHORT, 0); 
glBindVertexArray(_planeVAO); 
glDrawElements(GL_TRIANGLES, _numberOfIndicesPlane, GL_UNSIGNED_SHORT, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glDrawBuffer(GL_BACK); 
glReadBuffer(GL_BACK); 

は当初、私はシャドウマップを作成したいが、この時点で私は単に明示的な値を書き込むしようとしています次のシェードを使用して、フレームバッファに接続されたテクスチャ全体

glViewport(0, 0, _screenWidth, _screenHeight); 
glClearColor(0.7f, 0.5f, 0.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
_testShader.bind(); 
glBindTexture(GL_TEXTURE_2D, _shadowMap); 
glBindVertexArray(_quadVAO); 
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); 

:Rペア(_shadowShaderで使用されるもの)

頂点

#version 450 

in layout(location=0) vec3 position; 

uniform mat4 mvp; 

void main() 
{ 
    gl_Position = mvp * vec4(position, 1.0f); 
} 

断片

#version 450 

out float depth; 

void main() 
{ 
    depth = 0.0f; 
} 

は、私は、クワッドにテクスチャを表示しようとすることで仕上げますクワッドのフラグメントシェーダは次のとおりです。

#version 450 

in vec2 textureCoordinates; 

uniform sampler2D _shadowMap; 

out vec4 color; 

void main() 
{ 
    float depth = texture2D(_shadowMap, textureCoordinates).r; 
    color = texture2D(_shadowMap, textureCoordinates); 
} 

しかし、私はフラグメントシェーダから0.0f(黒)を出力していますが、クワッドは白く表示されています...クワッドがテクスチャを表示できることはわかっています。それに.jpgを表示する通常のテクスチャです。だから、これは私が今どこにいるのかです。任意のアイデア、ポインタ、思考、動機付けの言葉など?

EDIT I:もう少し後で、テクスチャが正しく読み込まれ、読み込めることがわかりました。私はこれを、実際に初期化中にイメージにロードしてから書き込んだりしています。クワッドはテクスチャを正しく表示します。だから私はそれにどのように書いているか何かが間違っている必要があります。

EDIT II:私はそれを働かせました。私はTAで座って、コードを貼り付けてコピーしました(そうです、私は知っています...それよりはるかに良くなりません)。おかげバート:)

答えて

0

あなたの影がフラグメントシェーダを渡すだけで間違っている:

#version 450 

out float depth; 

void main() 
{ 
    depth = 0.0f; 
} 

これはちょうどあなたがそうでない色の添付ファイルに書き込まれます単一チャネル出力を、(宣言しません持ってる)。 FBOのデプスアタッチメントに書きたいので、組み込みのgl_FragDepth出力変数を使用する必要があります。そうしないと、GLは線形補間されたウィンドウ空間の深度値を深度バッファに書き込みます。

通常、深度バッファを1.0にクリアします。典型的な透視投影を使用すると、オブジェクトは1.0に非常に近く、たとえば0.99somethingのように深度値として表示されるため、わずか8ビットのグレースケールの結果はすべて白に見えます。

+0

返信いただきありがとうございます。私は実際にそれを働かせました、ちょうどそれを書こうとしていました。私はあなたが提案したものを試してみました。gl_fragDepth = 0.2fでしたが、どちらもうまくいきませんでした。私は私のTAの一人から何か助けを得ました。なぜなら、彼が私と一緒に座って、それが働いていたチュートリアルのコードを貼り付けたコピーを何らかの理由で持っていたからです。とにかくありがとう :) – MulattoKid

関連する問題