3

我需要知道我可以在我的 OpenGL 应用程序中使用多少种不同的颜色。

我的情况:我将使用 glReadPixels 读回绘制的像素,但颜色将具有整数含义而不是颜色。所以我需要知道我能代表多少信息。

我打算glGet与 GL_RED_BITS、GL_GREEN_BITS 和 GL_BLUE_BITS 一起使用。但这些已被弃用。如何使用至少在 OpenGL 3 上可用的功能来实现这一点?

4

1 回答 1

7

好的,我找到了我要找的东西。我的评论glGetFramebufferAttachmentParameteriv是正确的,这里有一些参考:

glGetFramebufferAttachmentParameteriv — 检索有关绑定帧缓冲区对象的附件信息

到现在为止还挺好。

如果默认帧缓冲区绑定到目标,则附件必须是 GL_FRONT_LEFT、GL_FRONT_RIGHT、GL_BACK_LEFT 或 GL_BACK_RIGHT 之一,标识颜色缓冲区。

所以是的,我们可以将它用于屏幕缓冲区!现在是您感兴趣的部分:

pname可以是:

  • GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE
  • GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE
  • GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE
  • GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE
  • GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE

params将包含指定附件的相应红色、绿色、蓝色、alpha、深度或模板组件中的位数。如果请求的组件不在附件中,则返回零。

哦,target可以GL_FRAMEBUFFER,我想。

编辑:你要求一个例子来总结这一切,所以......

glBindFramebuffer(GL_FRAMEBUFFER, 0);
GLint ret;

glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_FRONT_LEFT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &ret);

if (ret == GL_NONE)
    exit(1); // something is really bad there or FRONT_LEFT isn't your default buffer. Check it!

glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_FRONT_LEFT, GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE, &ret);

您可能INVALID_ENUMS会得到:

  • 如果目标不是接受的令牌之一,则会生成 GL_INVALID_ENUM。
  • 如果 pname 对于 GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 的值无效,则会生成 GL_INVALID_ENUM。
于 2013-02-28T13:49:43.993 回答