2016-05-05 11 views
-1

Ich arbeite seit einiger Zeit mit OpenGL, und obwohl ich verstehe, wie man es benutzt, bin ich ziemlich interessiert, wie es mehrere Masken behandelt und versteht. Beispiel:Wie behandelt OpenGL mehrere klare Masken?

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
//How does it understand that I want to clear the 
//color buffer and the depth buffer? 

Zuerst dachte ich, sie könnte wie so statische Variablen werden:

GL_COLOR_AND_DEPTH_BUFFER_BIT = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT; 

Aber dann erkannte ich, dass sie Hunderte von ihnen müssten jede einzelne mögliche Kombination haben, was albern scheint . Wie interpretieren sie das Ergebnis und finden heraus, welche zwei Masken ich löschen möchte?

+3

Ich bin mir nicht sicher, ob ich die Frage verstehe; Es ist ein einfacher Bit-Test. –

Antwort

0

Wie Colonel Thirty Two wies darauf hin, a GL implementation can use bit tests:

void GLAPIENTRY 
_mesa_Clear(GLbitfield mask) 
{ 
    ... 

    /* Accumulation buffers were removed in core contexts, and they never 
    * existed in OpenGL ES. 
    */ 
    if ((mask & GL_ACCUM_BUFFER_BIT) != 0 
     && (ctx->API == API_OPENGL_CORE || _mesa_is_gles(ctx))) { 
     _mesa_error(ctx, GL_INVALID_VALUE, "glClear(GL_ACCUM_BUFFER_BIT)"); 
     return; 
    } 

    ... 

    if (ctx->RenderMode == GL_RENDER) { 
     ... 

     if ((mask & GL_DEPTH_BUFFER_BIT) 
      && ctx->DrawBuffer->Visual.haveDepthBuffer) { 
     bufferMask |= BUFFER_BIT_DEPTH; 
     } 

     if ((mask & GL_STENCIL_BUFFER_BIT) 
      && ctx->DrawBuffer->Visual.haveStencilBuffer) { 
     bufferMask |= BUFFER_BIT_STENCIL; 
     } 

     if ((mask & GL_ACCUM_BUFFER_BIT) 
      && ctx->DrawBuffer->Visual.haveAccumBuffer) { 
     bufferMask |= BUFFER_BIT_ACCUM; 
     } 

     assert(ctx->Driver.Clear); 
     ctx->Driver.Clear(ctx, bufferMask); 
    } 
} 

Siehe die mask & GL_DEPTH_BUFFER_BIT -Prüfungsbedingungen.

#define GL_DEPTH_BUFFER_BIT 0x00000100 // == 0b000000100000000 
#define GL_ACCUM_BUFFER_BIT 0x00000200 // == 0b000001000000000 
#define GL_STENCIL_BUFFER_BIT 0x00000400 // == 0b000010000000000 
#define GL_COLOR_BUFFER_BIT 0x00004000 // == 0b100000000000000 
+1

Sicherlich offensichtlich für Sie, aber in Anbetracht der Ebene der Frage, könnte es erwähnenswert sein, dass dies funktioniert, weil die '* _BUFFER_BIT' Werte alle als Potenzen von 2 definiert sind. –