2009-06-13 1 views
0

Ich benutze OpenGL ES, um Dinge in meinem iPhone Spiel zu zeichnen. Manchmal mag ich ändern Sie das Alpha der Texturen, die ich zeichne. Hier ist der (Arbeits) Code, den ich benutze. Was ist, wenn überhaupt, in diesem Codebeispiel unnötig? Vielen Dank!Was mache ich, das ist unnötig? (iPhone, OpenGL ES)

// draw texture with alpha "myAlpha" 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_COMBINE); 
    glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB,GL_MODULATE); 
    glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB,GL_PRIMARY_COLOR); 
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB,GL_SRC_COLOR); 
    glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB,GL_TEXTURE); 
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB,GL_SRC_COLOR); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    glEnable(GL_BLEND); 
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
    glColor4f(myAlpha, myAlpha, myAlpha, myAlpha); 

    glPushMatrix(); 
    glTranslatef(xLoc, yLoc, 0); 
    [MyTexture drawAtPoint:CGPointZero]; 
    glPopMatrix(); 

    glColor4f(1.0, 1.0, 1.0, 1.0); 

Edit:

Die Probe obige Code ist w/a modifizierten Alpha-Wert für das Zeichnen (so kann ich verblassen Dinge in und out). Wenn ich nur zeichnen möchte, ohne den Alpha-Wert zu ändern, würde ich die letzten 5 Zeilen des obigen Beispiels nur ohne den letzten Aufruf von glColor4f verwenden.

Antwort

2

Meine Zeichnung wie folgt aussieht:

glBindTexture(GL_TEXTURE_2D, tex->name); // bind to the name 
glVertexPointer(3, GL_FLOAT, 0, vertices); // verices is the alignment in triangles 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); // coordinates describes the rectangle 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //draw 

Es ist schwer zu wissen, was Sie ohne genau zu wissen, entfernen können, was Sie zu tun versuchen.

edit:

Es sei denn, Sie Mischung an einem gewissen Punkt sind zu deaktivieren, können Sie all die Mischung loszuwerden ruft:

glEnable(GL_BLEND); 
glBlendFunc... 

Setzen Sie sie bei der Initialisierung Ihres GL Zustand, wenn Sie muss es einmal einstellen. Wenn Sie aktivieren und deaktivieren müssen, ist es besser, den Zustand einmal für alles zu setzen, was Sie zeichnen müssen, und dann den Zustand (einmal) für das Ungemischte wieder einzustellen.

OpenGL ist ein state machine also diese allgemeine Idee gilt überall wo Sie den GL Zustand ändern müssen (wie Texturumgebung mit glTexEnvf einstellen).

über Zustandsmaschinen:

Ein aktueller Zustand von Vergangenheit Zuständen des Systems bestimmt wird. Als solches kann es gesagt werden, um Informationen über der Vergangenheit aufzuzeichnen, d. H. Es spiegelt die Eingabe Änderungen vom Systemstart zum gegenwärtigen Zeitpunkt wider. Ein Übergang zeigt eine Statusänderung an und wird durch eine Bedingung beschrieben, die erfüllt sein müsste, um den Übergang zu ermöglichen.

+0

Hey Nick, ich möchte nur eine Textur mit einem modifizierten Alpha-Wert zeichnen (damit ich die Textur ein-/ausblenden kann). Ich bin mir nicht sicher, ob alle Codezeilen notwendig sind. – MrDatabase

2

Sie haben Anrufe, um sowohl die Texturumgebung als auch den Framebuffer Blending zu konfigurieren, die völlig unterschiedliche Funktionen sind. Sie rufen auch glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, x) zweimal vor dem Zeichnen auf, und nur der zweite Aufruf ist von Bedeutung.

Wenn Sie wirklich nur die Primärfarbe mit der Texturfarbe multiplizieren möchten, dann ist es so einfach wie glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE). Der Rest der Aufrufe von glTexEnv ist nicht notwendig.