1

定義したフラグメントバッファオブジェクト(FBO)に「gl_PrimitiveID」を出力したい非常に基本的なフラグメントシェーダーがあります。以下は私のフラグメントシェーダーです:

#version 150

uniform vec4 colorConst;

out vec4 fragColor;
out uvec4 triID;

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

FBOを次のように設定します。

  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);

何らかの理由で、glReadPixelsは「GL_INVALID_OPERATION」エラーを表示しますか?ただし、renderbufId1の内部形式を「GL_RGB32UI」から「GL_RGB」に変更し、glReadPixelsで「GL_UNSIGNED_INT」の代わりに「GL_FLOAT」を使用すると、すべてが正常に機能します。'GL_INVALID_OPERATION'エラーが発生する理由と、それを解決する方法を知っている人はいますか?

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

PS:このように「gl_PrimitiveID」を出力したい理由はここで説明されています:glDrawElementsを使用するときにOpenGLコアプロファイルで三角形を選択する

4

1 に答える 1

3

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

OpenGL Wikiに記載されているように、GL_RED_INTEGER真の整数データを転送するときに使用する必要があります。それ以外の場合、OpenGL は浮動小数点変換を使用しようとします。

ところで、glBindFragDataLocationこれらのフラグメントシェーダー出力がどのバッファーに行くかを設定するために使用していることを確認してください。または、GLSL 3.30 以降を使用している場合は、シェーダーで明示的に設定することもできます。

于 2012-02-13T17:17:56.750 に答える