0

シェーダーでフラグメントの世界の位置を取得しようとしています。このために、fbo を作成し、テクスチャを GL_RGB32F 形式でバインドして、GL_COLOR_ATTACHMENT0 にアタッチします。

glGenFramebuffers(1,&fbo);
glBindFramebuffer(GL_FRAMEBUFFER,fbo);

glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,texture);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB32F,WINDOW_WIDTH,WINDOW_HEIGHT,0,GL_RGB,GL_FLOAT,NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,texture,0);

頂点シェーダーとフラグメント シェーダーは次のようになります。

頂点シェーダー

#version 330
layout(location = 0) in vec3 vertexposition;

out vec4 position; 

uniform mat4 MVP;
uniform mat4 Model;

void main()
{
    gl_Position = MVP*vec4(vertexposition,1.0f);
    position = Model*vec4(vertexposition,1.0f);
}

フラグメント シェーダー

#version 330
in vec4 position;

out vec3 outputPosition;

void main()
{
    outputPosition = position.xyz;
}

私が正しければ、頂点のワールド位置の補間により、outputPosition はワールド座標でフラグメントの位置を持ちます。

glDrawArrays を呼び出した後、次のフラグメントのワールド位置を持つカラー バッファーを読み取ります。

glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(0,0,WINDOW_WIDTH,WINDOW_HEIGHT,GL_RGB,GL_FLOAT,pixelInfo);

しかし、これらのポイントを描画すると、オブジェクトの位置と一致しません。エラーがどこにあるのかわかりません。何か案が?

4

1 に答える 1

0

深度バッファを使用して問題を解決しました。エラーは、描画されたピクセルを認識する方法にありました。

于 2013-02-27T14:57:21.480 に答える