Dies ist hoffentlich eine einfache Frage: Ich habe eine OpenGL-Textur und möchte in der Lage sein, seine Deckkraft zu ändern, wie mache ich das? Die Textur hat bereits einen Alpha-Kanal und das Mischen funktioniert gut, aber ich möchte in der Lage sein, die Deckkraft der gesamten Textur zu verringern, um sie in den Hintergrund zu bringen. Ich habe mit glBlendFunc
fiedeln, aber ohne Glück - es scheint, dass ich etwas wie GL_SRC_ALPHA_MINUS_CONSTANT
benötigen würde, die nicht verfügbar ist. Ich arbeite am iPhone mit OpenGL ES.Ändern der Textur Opazität in OpenGL
Antwort
Vielen Dank für die Ideen. Ich habe sowohl mit glColor4f als auch mit glTexEnv gespielt und mich schließlich gezwungen, die glTexEnv-Manpage sorgfältig zu lesen. Die Manpage besagt, dass im GL_MODULATE-Texturierungsmodus die resultierende Farbe berechnet wird, indem das ankommende Fragment mit der Texturierungsfarbe (C = Cf × Ct) multipliziert wird, das gleiche gilt für das Alpha. Ich habe versucht, glColor4f (1, 1, 1, Opazität) und das hat nicht funktioniert, aber die gewünschte Opazität in alle vier Argumente des Aufrufs passierte den Trick. (Immer noch nicht sicher warum, aber.)
Ich habe keine Ahnung von OpenGL ES, aber in Standard OpenGL würden Sie die Deckkraft durch eine Farbe für die Textur zu erklären, bevor Sie es verwenden:
// R, G, B, A
glColor4f(1.0, 1.0, 1.0, 0.5);
Das Beispiel würden Sie 50% alpha geben ohne Beeinträchtigung die Farbe deiner Textur. Durch Anpassen der anderen Werte können Sie auch die Texturfarbe verschieben.
Die einfachste Möglichkeit besteht darin, den Alpha-Wert der Textur im laufenden Betrieb zu ändern. Da Sie OpenGL zu einem bestimmten Zeitpunkt über die Textur informieren, haben Sie die Bitmap im Speicher. Also binden Sie die Textur einfach an die gleiche Textur-ID an. Falls Sie es nicht im Speicher haben (aufgrund von Platzbeschränkungen, da Sie sich auf ES befinden), können Sie die Textur erneut in einen Puffer laden, indem Sie glGetTexImage() verwenden. Das ist die saubere Lösung.
Die Operationen zum Speichern/Abrufen sind jedoch etwas kostspielig, daher sollten Sie eine andere Lösung wünschen. Wenn Sie darüber nachdenken, können Sie möglicherweise mit der Geometrie hinter der Geometrie arbeiten, die Ihre Textur anzeigt, oder einfach mit dem Material/der Farbe der Geometrie arbeiten, die die Textur enthält. Sie werden wahrscheinlich eine additive Mischung der Rückgeometrie haben wollen. eine glBlendFunc von
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA),
Mit könnten Sie in der Lage sein, „leicht“ und - noch wichtiger ist, billig - die gewünschte Wirkung zu erzielen.
Eine Textur wird normalerweise für mehrere Objekte verwendet. Wenn sie geändert wird, ändert sich die Transparenz für alle Objekte. Auf vielen Systemen sind Textur-Uploads aufgrund interner Formatkonvertierungen viel langsamer als ein einfacher Kopiervorgang. – noop
Verwenden Sie einen Texture Combiner. Legen Sie die Texturstufe fest, um eine Operation zwischen einer Textur und einer konstanten Farbe auszuführen. Dann ändern Sie die Konstante Farbe von Ihrem Code (glTexEnv
, GL_TEXTURE_ENV_COLOR
).
Dies sollte als "frei" in Bezug auf die Leistung kommen. Bei den meisten (wenn nicht allen) Grafikchip-Combiner-Operationen wird die gleiche Anzahl von GPU-Zyklen (normalerweise 1) verwendet, so dass die Verwendung einer Textur gegenüber einer Modulationsoperation (oder einer anderen Operation) genau die gleichen Kosten darstellt.
Hmm .. eine sehr elegante + einfache Lösung, NeARAZ. – mstrobl
Höchstwahrscheinlich verwenden Sie CG, um Ihr Bild in eine Textur zu bekommen. Wenn Sie cg verwenden, wird das Alpha vormultipliziert, weshalb Sie das Alpha für rgba der Funktion color4f verwenden müssen.
Ich vermute, dass Sie einen schwarzen Hintergrund hatten, und durch die Verringerung der Menge von jeder Farbe, Sie effektiv verblassen die Farbe zu schwarz.
Grundsätzlich haben Sie zwei Möglichkeiten: Verwenden Sie glTexEnv für Ihre Textur mit GL_MODULATE und spezifizieren Sie die Farbe mit glColor4 * und verwenden Sie eine undurchsichtige Ebene für den Alpha-Kanal. Beachten Sie, dass glTexEnv nur einmal ausgegeben werden sollte, wenn Sie Ihre Textur zum ersten Mal laden. Dieses Szenario funktioniert nicht, wenn Sie jedoch Farben in Ihren Vertex-Attributen angeben.Diese überschreiben nämlich jede glColor4 * -Farbe, die Sie einstellen können. In diesem Fall möchten Sie vielleicht auf eine der beiden folgenden Optionen zurückgreifen: Verwenden Sie Texture Combiner (Advanced Topic, nicht schön in fixed-pipeline zu verwenden), oder "manually" ändert das Vertex Colour Attribut jedes einzelnen Vertex (kann für größere Maschen).
Und das hat Sie dazu gebracht, Ihre eigene "Antwort" als akzeptierte Antwort zu markieren? – zmippie
Ja, da es das Problem gelöst hat, das ich hatte. Fühlen Sie sich frei zu widersprechen :) – zoul
Sie sind etwas falsch mit den Texturen einstellen. Was Dan beantwortet hat, funktioniert und macht Sinn, Ihre "Lösung" ist ein Hack. – cjcela