2012-02-13 27 views
0

私は定義したフラグメントバッファオブジェクト(FBO)に 'gl_PrimitiveID'を出力したい非常に基本的なフラグメントシェーダを持っています。以下は私のフラグメントシェーダです:gl_PrimitiveIDをカスタムフレームバッファオブジェクト(FBO)に出力する際の問題

#version 150 

uniform vec4 colorConst; 

out vec4 fragColor; 
out uvec4 triID; 

void main(void) 
{ 
    fragColor = colorConst; 
    triID.r = uint(gl_PrimitiveID); 
} 

Iセットアップこのように私のFBO:何らかの理由glReadPixelsについては

GLuint renderbufId0; 
    GLuint renderbufId1; 
    GLuint depthbufId; 
    GLuint framebufId; 


    // generate render and frame buffer objects 
    glGenRenderbuffers(1, &renderbufId0); 
    glGenRenderbuffers(1, &renderbufId1); 
    glGenRenderbuffers(1, &depthbufId ); 
    glGenFramebuffers (1, &framebufId ); 


    // setup first renderbuffer (fragColor) 
    glBindRenderbuffer(GL_RENDERBUFFER, renderbufId0); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, gViewWidth, gViewHeight); 


    // setup second renderbuffer (triID) 
    glBindRenderbuffer(GL_RENDERBUFFER, renderbufId1); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB32UI, gViewWidth, gViewHeight); 


    // setup depth buffer 
    glBindRenderbuffer(GL_RENDERBUFFER, depthbufId); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32, gViewWidth, gViewHeight); 


    // setup framebuffer 
    glBindFramebuffer(GL_FRAMEBUFFER, framebufId); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbufId0); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, renderbufId1); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthbufId ); 


    // check if everything went well 
    GLenum stat = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
    if(stat != GL_FRAMEBUFFER_COMPLETE) { exit(0); } 


    // setup color attachments 
    const GLenum att[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1}; 
    glDrawBuffers(2, att); 


    // render mesh 
    RenderMyMesh() 


    // copy second color attachment (triID) to local buffer 
    glReadBuffer(GL_COLOR_ATTACHMENT1); 
    glReadPixels(0, 0, gViewWidth, gViewHeight, GL_RED, GL_UNSIGNED_INT, data); 

は私に 'GL_INVALID_OPERATION' エラーを与えますか?しかし、私が 'GL_RGB32UI'から 'GL_RGB'へのrenderbufId1の内部フォーマットを変更し、 'GL_UNSIGNED_INT'の代わりにglReadPixelsで 'GL_FLOAT'を使用すると、すべて正常に動作します。誰も私が 'GL_INVALID_OPERATION'エラーを取得している理由と私はそれを解決する方法を知っていますか?

「gl_PrimitiveID」を出力する別の方法はありますか?

PS:私は出力したい理由、これはここで説明されるように 'gl_PrimitiveID':Picking triangles in OpenGL core profile when using glDrawElements

答えて

2

glReadPixels(0、0、gViewWidth、gViewHeight、GL_RED、GL_UNSIGNED_INT、データ);

on the OpenGL Wikiと同じように、真の整数データを転送するときは、GL_RED_INTEGERを使用する必要があります。そうしないと、OpenGLは浮動小数点変換を使用しようとします。

ところで、glBindFragDataLocationを使用して、それらのフラグメントシェーダー出力に行くバッファを設定していることを確認してください。また、GLSL 3.30以上を使用している場合はset it up explicitly in the shaderにすることもできます。

+0

ありがとうございます。それがトリックでした。また、 'vec3'の色成分ではなく、単一の 'uint'に 'gl_PrimitiveID'を出力する方法(可能な場合)を知っていますか? – WesDec

+1

@WesDec: 'uint'に書き込む場合は' uint'に書き出します。出力(または入力)がベクトル型でなければならないというルールはありません。出力画像に4つの値がすべて必要なルールはありません。 GL_RUI32は完全に有効な[画像フォーマット](http://www.opengl.org/wiki/Image_Format)です。また、「vec3」の色成分もありません。 ".r"は ".x"と同じことを意味し、 ".s"と同じ意味です。すべてのスウィズルマスクは同じことを意味します。 –

+0

私は上記の2番目の 'glRenderbufferStorage'呼び出しでGL_RGB32UIの代わりにGL_R32UIを使用しようとしましたが、GL_INVALID_ENUMエラーが発生しますか?それは私のOpenGLドライバ(Im on linux)でサポートされていないだけかもしれませんか?スウィズルマスクは同じ意味ですが、 'glReadPixels'パラメータを使用すると、「カラー」「深度」または「ステンシル」(GL_RED、GL_RGBA、GL_DEPTH_STENCILなど)と考えることができます。 「vec3」の色成分として表示されます。 – WesDec

関連する問題