私は定義したフラグメントバッファオブジェクト(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
ありがとうございます。それがトリックでした。また、 'vec3'の色成分ではなく、単一の 'uint'に 'gl_PrimitiveID'を出力する方法(可能な場合)を知っていますか? – WesDec
@WesDec: 'uint'に書き込む場合は' uint'に書き出します。出力(または入力)がベクトル型でなければならないというルールはありません。出力画像に4つの値がすべて必要なルールはありません。 GL_RUI32は完全に有効な[画像フォーマット](http://www.opengl.org/wiki/Image_Format)です。また、「vec3」の色成分もありません。 ".r"は ".x"と同じことを意味し、 ".s"と同じ意味です。すべてのスウィズルマスクは同じことを意味します。 –
私は上記の2番目の 'glRenderbufferStorage'呼び出しでGL_RGB32UIの代わりにGL_R32UIを使用しようとしましたが、GL_INVALID_ENUMエラーが発生しますか?それは私のOpenGLドライバ(Im on linux)でサポートされていないだけかもしれませんか?スウィズルマスクは同じ意味ですが、 'glReadPixels'パラメータを使用すると、「カラー」「深度」または「ステンシル」(GL_RED、GL_RGBA、GL_DEPTH_STENCILなど)と考えることができます。 「vec3」の色成分として表示されます。 – WesDec