1

OpenGL でフレーム バッファを使用して深度テクスチャをレンダリングする際に問題が発生し、自分で問題を見つけることができません。

セットアップは次のとおりです。

//initialize color texture
glGenTextures(1, &color_buffer);
glBindTexture(GL_TEXTURE_2D, color_buffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_FLOAT, NULL); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); 
glBindTexture(GL_TEXTURE_2D, 0);

//initialize depth texture
glGenTextures(1, &depth_buffer);  
glBindTexture(GL_TEXTURE_2D, depth_buffer); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

//bind both textures to a frame buffer
glGenFramebuffers(1, &frame_buffer); 
glBindFramebuffer(GL_FRAMEBUFFER, frame_buffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_buffer, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_buffer, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

シーンをフレーム バッファにレンダリングした後、次のコードを使用してテクスチャをレンダリングしました。color_buffer を使用すると、シーンが正しく描画されます。しかし、depth_buffer を使用すると、画面がすべて白くなります。ここで何が問題なのかわかりません。私のフラグメント シェーダーはgl_FragColor = texture2D(texture_ID,texture_coord);を使用するだけです。レンダリングします。コードの何が問題になっていますか? 深度テクスチャをレンダリングするにはどうすればよいですか?

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, ***color_buffer***);
glUseProgramObjectARB( program );
glUniform1i(glGetUniformLocation(program,"img"),0);
//codes that attach the texture to a quad
4

1 に答える 1

4

しかし、depth_buffer を使用すると、画面がすべて白くなります。

私のフラグメント シェーダーは gl_FragColor = texture2D(texture_ID,texture_coord); を使用するだけです。レンダリングします。

それがあなたの深度バッファです。実際にレンダリングしたもの(または使用する射影行列)について何も知らずに確認することはできません。しかし、一般的に言えば、透視投影は非常に歪んだ変換になる傾向があります。[0, 1] の範囲で Z をより遠い値に歪ませるので、ほとんどの数値は 0 よりも 1 に近くなります。

ある種の線形空間で深度値が必要な場合は、それらを線形化する必要があります。乗算するクリップスペース W がないと、これはやや困難になります。それは可能ですが、それを行うには視点マトリックスからの値が必要です。

于 2013-08-09T05:47:32.757 に答える