【问题标题】:What is the purpose of GL_COLOR_BUFFER_BIT and GL_DEPTH_BUFFER_BIT?GL_COLOR_BUFFER_BIT 和 GL_DEPTH_BUFFER_BIT 的用途是什么?
【发布时间】:2011-03-29 23:02:49
【问题描述】:

作为 OpenGL 初学者,我想知道他们做什么以及为什么需要这些。比如在通话中

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

【问题讨论】:

    标签: opengl


    【解决方案1】:

    GL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BIT 不是函数,它们是常量。您使用它们来告诉glClear() 您希望它清除哪些缓冲区 - 在您的示例中,深度缓冲区和“当前启用颜色写入的缓冲区”。您也可以通过GL_ACCUM_BUFFER_BIT 清除累积缓冲区和/或GL_STENCIL_BUFFER_BIT 清除模板缓冲区。

    在使用库时,常量的实际值对您来说并不重要——重要的实现细节是每个常量的二进制表示不会相互重叠。正是这一特性让您可以将多个常量的按位 OR 传递给对 glClear() 的单个调用。

    查看glClear() documention了解更多详情。

    【讨论】:

    • 我在问这些常量我们为什么使用它们我想要更多关于它们的信息!!
    • 文档告诉我 GL_COLOR_BUFFER_BIT 表示当前启用颜色写入的缓冲区。 GL_DEPTH_BUFFER_BIT 表示深度缓冲区。
    • 没有更多关于他们的信息......我想你可以看看gl.h。在我的机器上GL_COLOR_BUFFER_BIT0x00004000GL_DEPTH_BUFFER_BIT0x00000100。还有什么要了解的?
    • @Carl Norum:这些 OpenGL 标记(常量)的数值已记录在规范中。 @Mohamed Amged:传递给 glClear 的值在 OpenGL 驱动程序中通过类似于以下的代码进行评估: glClearOfTheDriver(GLbitfield mask){ if(mask & GL_COLOR_BUFFER_BIT) clear_the_color_buffer; if(mask & GL_DEPTH_BUFFER_BIT) clear_the_depth_buffer; ... };这真的没什么。可传递给 glClear 的那些标记是正交(位)向量(在 Wikipedia 上查找正交向量以了解这意味着什么)。
    • @CarlNorum,在这里得到了完美的解释。干杯。 Why do we clear GL_DEPTH_BUFFER_BIT
    【解决方案2】:

    调用 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 清除 OpenGL 颜色和深度缓冲区(或任何其他缓冲区或缓冲区组合)。 OpenGL 是一个状态机,最好从干净的状态开始每一帧。

    【讨论】:

      【解决方案3】:

      我在阅读此内容时偶然发现了这个问题,并想为任何困惑的人添加一些细节。我看到这两个变量是常量,表示位值中的选项。

      glClear() 方法需要知道要清除什么类型的缓冲区。但是,有许多缓冲区,例如颜色和深度缓冲区等 (https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glClear.xml)。

      通过使用位来表示选项,通过执行 OR 操作来设置多个选项变得更加容易。

      有关更多详细信息,请查看此“位操作”教程,即“位标志何时最有用?”部分位于:https://www.learncpp.com/cpp-tutorial/bit-manipulation-with-bitwise-operators-and-bit-masks/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-18
        • 2012-04-17
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多