Проблемы с выводом gl_PrimitiveID в объект буфера пользовательского кадра (FBO) - PullRequest
1 голос
/ 13 февраля 2012

У меня есть очень простой фрагментный шейдер, который я хочу вывести 'gl_PrimitiveID' в объект буфера фрагмента (FBO), который я определил.Ниже представлен мой фрагментный шейдер:

#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», и я использую «GL_FLOAT» в glReadPixels вместо «GL_UNSIGNED_INT», то все работает нормально.Кто-нибудь знает, почему я получаю ошибку 'GL_INVALID_OPERATION' и как я могу ее решить?

Есть ли альтернативный способ вывода 'gl_PrimitiveID'?

PS: причина, по которой я хочу вывести 'gl_PrimitiveID', описана здесь: Выбор треугольников в профиле ядра OpenGL, когдаиспользуя glDrawElements

1 Ответ

3 голосов
/ 13 февраля 2012

glReadPixels (0, 0, gViewWidth, gViewHeight, GL_RED, GL_UNSIGNED_INT, data);

Как указано в OpenGL Wiki , вам необходимо использовать GL_RED_INTEGER при передаче истинных целочисленных данных. В противном случае OpenGL попытается использовать для него преобразование с плавающей запятой.

Кстати, убедитесь, что вы используете glBindFragDataLocation, чтобы установить, к каким буферам будут обращаться эти выходы фрагментного шейдера. Кроме того, вы можете явно установить его в шейдере , если вы используете GLSL 3.30 или выше.

...