シャドーマッピングを動作させようとしていましたが、失敗しました。今はフレームバッファに何かを書き込もうとしていますそれをテクスチャとしてクワッドにレンダリングします。私はこの小さなコードを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で座って、コードを貼り付けてコピーしました(そうです、私は知っています...それよりはるかに良くなりません)。おかげバート:)
返信いただきありがとうございます。私は実際にそれを働かせました、ちょうどそれを書こうとしていました。私はあなたが提案したものを試してみました。gl_fragDepth = 0.2fでしたが、どちらもうまくいきませんでした。私は私のTAの一人から何か助けを得ました。なぜなら、彼が私と一緒に座って、それが働いていたチュートリアルのコードを貼り付けたコピーを何らかの理由で持っていたからです。とにかくありがとう :) – MulattoKid