Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
glClear函数:有关参数的问题_C_Memory_Opengl_Bits - Fatal编程技术网

glClear函数:有关参数的问题

glClear函数:有关参数的问题,c,memory,opengl,bits,C,Memory,Opengl,Bits,我想深入了解glClear的功能。我理解它的一般解释->清除颜色、深度、模板和累积的缓冲区,但我还有其他问题。 我的朋友假设你清除了表示颜色、深度、模板和内存(堆栈?)中积累的位。通过指定和应用参数:(例如,仅颜色和深度)“掩码”,您只清除内存中的那些位(因此是“按位操作”) 例如: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); www.khronos.org“mask”对参数的解释。 掩码:表示要清除的缓冲区的按位或掩码 以下是我的

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

例如:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
www.khronos.org“mask”对参数的解释。 掩码:表示要清除的缓冲区的按位或掩码

以下是我的问题:

  • 参数GL_COLOR_BUFFER_BIT和GL_DEPTH_BUFFER_BIT是否分别代表1位内存?或者它们由多少位表示(我想了解位掩码实际上是如何应用的)
  • 我看不出“或”掩码如何抵消位?如果在标记为“set”(而不是“unset”)的位上使用“OR”,它仍将返回零(1或0仍返回1)?我是否认为这是完全错误的/我遗漏了什么
  • “或”标志(管道)出了什么问题;为什么这些参数没有用普通的逗号分隔,而且按位操作“或”不是在实际函数中声明的
也许我把事情弄糊涂了,因为我是这个领域的新手。
你能给我一个详尽的解释吗?我不想在OpenGL中跳过这些问题;我想知道我在做什么,这种理解可能会帮助我前进。谢谢

您给glClear的按位组合不是用以清除缓冲区的位。缓冲区用其特定的清除颜色(glClearColor)或清除深度值(我想是glClearDepth?)单独清除。glClear的位标志只告诉它要清除哪些缓冲区。它们按位或运算,只需指定多个要清除的缓冲区

编辑:您可以想象它的工作方式如下:

void glClear(unsigned int bits)
{
    if(bits & GL_COLOR_BUFFER_BIT)    //color bit is set
    {
        //clear color buffer using current clear color
    }
    if(bits & GL_DEPTH_BUFFER_BIT)    //depth bit is set
    {
        //clear depth buffer using current clear depth value (usually 1)
    }
    if(bits & GL_STENCIL_BUFFER_BIT)  //stencil bit is set
    {
        //clear stencil buffer using current clear stencil value (usually 0)
    }
}

您提供给glClear的按位组合不是用于清除缓冲区的位。缓冲区用其特定的清除颜色(glClearColor)或清除深度值(我想是glClearDepth?)单独清除。glClear的位标志只告诉它要清除哪些缓冲区。它们按位或运算,只需指定多个要清除的缓冲区

编辑:您可以想象它的工作方式如下:

void glClear(unsigned int bits)
{
    if(bits & GL_COLOR_BUFFER_BIT)    //color bit is set
    {
        //clear color buffer using current clear color
    }
    if(bits & GL_DEPTH_BUFFER_BIT)    //depth bit is set
    {
        //clear depth buffer using current clear depth value (usually 1)
    }
    if(bits & GL_STENCIL_BUFFER_BIT)  //stencil bit is set
    {
        //clear stencil buffer using current clear stencil value (usually 0)
    }
}

当您指定要清除的内容时,编写内容的方式允许更大的灵活性。以下是如何定义标志:

#define GL_COLOR_BUFFER_BIT 1 // 0000 0001
#define GL_DEPTH_BUFFER_BIT 2 // 0000 0010
如你所见,这是2的幂。这样,在内存中,每个标志只有一位被设置为1(显然是在不同的位置)。 在这些标志上计算按位OR时,得到0000 0011。要知道结果值中是否设置了标志,只需使用选中的标志计算一个按位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
}

当您指定要清除的内容时,编写内容的方式允许更大的灵活性。以下是如何定义标志:

#define GL_COLOR_BUFFER_BIT 1 // 0000 0001
#define GL_DEPTH_BUFFER_BIT 2 // 0000 0010
如你所见,这是2的幂。这样,在内存中,每个标志只有一位被设置为1(显然是在不同的位置)。 在这些标志上计算按位OR时,得到0000 0011。要知道结果值中是否设置了标志,只需使用选中的标志计算一个按位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
}

正如其他人所说,那些
GL\u COLOR\u BUFFER\u位
和相关位掩码与写入各种缓冲区的最终清除值无关。每个都只是一个标志,
glClear()
在内部进行检查(使用按位和其他人指出的方法)以决定对哪些缓冲区进行操作

一旦检查了缓冲区标志,从概念上讲,
glClear()
只是在帧缓冲区中的每个像素上循环,并将其设置为“clear”值,这样您就有了一块空白的石板来绘制。使用
glClearColor()
等设置这些值。你可能会这样想:

void glClear(GLuint buffers)
{
  if (buffers & GL_COLOR_BUFFER_BIT) {
    for (int i = 0; i < height; ++i) {
      for (int j = 0; j < width; ++j) {
        colorBuffer[i][j].r = clearColor.r;
        colorBuffer[i][j].g = clearColor.g;
        colorBuffer[i][j].b = clearColor.b;
        colorBuffer[i][j].a = clearColor.a;
      }
    }
  }

  if (buffers & GL_DEPTH_BUFFER_BIT) {
    // Etc, using depthBuffer and glClearDepth value instead here
  }

  // etc. for accum & aux buffers.
}
void glClear(GLuint缓冲区)
{
if(缓冲区和GL\U颜色\U缓冲区\U位){
对于(int i=0;i
正如其他人所说,那些
GL\u COLOR\u BUFFER\u BIT
和相关位掩码与写入各种缓冲区的最终清除值无关。每个都只是一个标志,
glClear()
在内部进行检查(使用按位和其他人指出的方法)以决定对哪些缓冲区进行操作

一旦检查了缓冲区标志,从概念上讲,
glClear()
只是在帧缓冲区中的每个像素上循环,并将其设置为“clear”值,这样您就有了一块空白的石板来绘制。使用
glClearColor()
等设置这些值。你可能会这样想:

void glClear(GLuint buffers)
{
  if (buffers & GL_COLOR_BUFFER_BIT) {
    for (int i = 0; i < height; ++i) {
      for (int j = 0; j < width; ++j) {
        colorBuffer[i][j].r = clearColor.r;
        colorBuffer[i][j].g = clearColor.g;
        colorBuffer[i][j].b = clearColor.b;
        colorBuffer[i][j].a = clearColor.a;
      }
    }
  }

  if (buffers & GL_DEPTH_BUFFER_BIT) {
    // Etc, using depthBuffer and glClearDepth value instead here
  }

  // etc. for accum & aux buffers.
}
void glClear(GLuint缓冲区)
{
if(缓冲区和GL\U颜色\U缓冲区\U位){
对于(int i=0;i
所以。。。在幕后到底发生了什么?你能提供一些说明吗?我的错,但我还不明白。。。我找到的关于按位“or”的解释如下:(按位或)如果操作数中的一个或两个对应位均为1,则将位设置为1,并将位设置为0