glClear函数:关于参数的问题

Tra*_*ace 1 c memory opengl bits

我想了解glClear功能的深层次.我理解它的一般解释 - >清除颜色,深度,模板和积累的缓冲区,但我还有其他问题.我的朋友假设您清除了代表内存中颜色,深度,模板和积累的位(堆栈?).通过指定和应用参数:(例如,仅颜色和深度)'掩码',您只清除存储器中的那些位(因此"按位操作").

举个例子:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
Run Code Online (Sandbox Code Playgroud)

www.khronos.org对"掩码"的参数说明.mask:掩码的按位OR,表示要清除的缓冲区.

这是我的问题:

  • 参数GL_COLOR_BUFFER_BIT和GL_DEPTH_BUFFER_BIT各占1位内存吗?或者它们表示了多少位(我想了解如何实际应用位掩码)?
  • 我没看到"OR"掩码如何取消位?如果对标记为"set"(而不是"unset")的位使用"OR",它仍然会返回零(1或0仍然返回1)?我觉得这完全错了吗?我在这里错过了什么吗?
  • 什么是"或"标志(管道); 为什么这些参数没有用通常的逗号分隔,而不是在实际函数中声明的按位操作"OR"?

也许我很困惑,因为我是这个领域的新手.能否请您详尽解释一下?我不想在OpenGL中继续这些问题时跳过这些问题; 我想知道我在做什么,并且这种理解可能会帮助我.谢谢!

Sim*_*mon 7

当您指定要清除的内容时,编写内容的方式可以提供更大的灵活性.这里如何定义标志:

#define GL_COLOR_BUFFER_BIT 1 // 0000 0001
#define GL_DEPTH_BUFFER_BIT 2 // 0000 0010
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,那些是2的幂.这样,在内存中,每个标志只有一位被设置为1(显然在不同的位置).当你在那些标志上计算按位OR时,你得到0000 0011.要知道在结果值中是否设置了一个标志,你只需要用checked标志计算一个按位AND.

int foo = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT; // foo = 0000 0011

if (foo & GL_COLOR_BUFFER_BIT) { // 0000 0011 & 0000 0001 => 0000 0001 (!= 0)
    // clear color buffer(which is located at a position OpenGL knows)
}
if (foo & GL_DEPTH_BUFFER_BIT) { // 0000 0011 & 0000 0010 => 0000 0010 (!= 0)
    // clear depth buffer
}
Run Code Online (Sandbox Code Playgroud)