【问题标题】:Problems outputting gl_PrimitiveID to custom frame buffer object (FBO)将 gl_PrimitiveID 输出到自定义帧缓冲区对象 (FBO) 时出现问题
【发布时间】:2012-02-14 01:17:56
【问题描述】:

我有一个非常基本的片段着色器,我想将“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”,并且在 glReadPixels 中使用“GL_FLOAT”而不是“GL_UNSIGNED_INT”,那么一切正常。有谁知道我为什么会收到“GL_INVALID_OPERATION”错误以及如何解决它?

是否有另一种输出“gl_PrimitiveID”的方法?

PS:我想像这样输出'gl_PrimitiveID'的原因在这里解释:Picking triangles in OpenGL core profile when using glDrawElements

【问题讨论】:

    标签: opengl glsl gpgpu opengl-3


    【解决方案1】:

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

    on the OpenGL Wiki 所述,传输真整数数据时需要使用GL_RED_INTEGER。否则,OpenGL 会尝试对其使用浮点转换。

    顺便说一句,请确保您使用glBindFragDataLocation 来设置片段着色器输出的缓冲区。或者,如果您使用 GLSL 3.30 或更高版本,您也可以set it up explicitly in the shader

    【讨论】:

    • 非常感谢。那成功了。您是否也知道如何(如果可能)在单个“uint”中输出“gl_PrimitiveID”而不是“vec3”的颜色分量?
    • @WesDec:如果你想写信给uint,那么就写信给uint。没有规定输出(或输入)必须是向量类型。并且没有规定输出图像必须具有所有四个值; GL_RUI32 是一个完全有效的image format。此外,没有“'vec3' 的颜色组件”这样的东西。 “.r”与“.x”的意思相同,也就是与“.s”的意思相同。所有的调酒面具都意味着同样的事情。
    • 谢谢 我在上面的第二个 'glRenderbufferStorage' 调用中尝试使用 GL_R32UI 而不是 GL_RGB32UI,但我收到 GL_INVALID_ENUM 错误?难道是我的 OpenGL 驱动程序不支持它(我在 linux 上)?我知道 swizzle 掩码的含义相同,但“glReadPixels”参数让您将它们视为“颜色”、“深度”或“模板”(GL_RED、GL_RGBA、GL_DEPTH_STENCIL 等),这就是我提到它们的原因作为“'vec3'的颜色分量”。
    • @WesDec:如果您的司机可以使用GL_RGB32UI,那么他们应该可以使用GL_R32UI。所以听起来你需要更新你的驱动程序。
    • 这很奇怪.. 我在最新的 ATI FGLRX 驱动程序上,当我使用 GLR32UI 时出现上述错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多