Frage

Ich suche nach einer Möglichkeit, über einen Shader auf OpenGL-Status zuzugreifen.Der GLSL-Kurzanleitung, eine großartige Ressource, konnte mir in diesem Fall nicht wirklich weiterhelfen.

In dem Beispiel, an dem ich arbeite, habe ich die beiden folgenden Shader:

Scheitel:

void    main()
{
    gl_FrontColor = gl_Color;
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

Fragment:

uniform sampler2D   tex;
uniform float   flattening;

void main( void ) 
{
    vec4    texel;
    texel = texture2D(tex, gl_TexCoord[0].st);
    texel.r *= gl_Color.r;
    texel.g *= gl_Color.g;
    texel.b *= gl_Color.b;
    texel.a *= gl_Color.a;
    gl_FragColor = texel;
}

Wenn ich Polygone rendere, die nicht texturiert sind, sind ihre Alphawerte korrekt, ihnen wird jedoch die Farbe Schwarz zugewiesen.

1. Welche bedingte Prüfung kann ich einrichten, damit die Variable „Texel“ auf a gesetzt wird vec4(1.0, 1.0, 1.0, 1.0) anstatt aus einer Textur zu sampeln, wenn GL_TEXTURE_2D ist behindert?

2. Wäre die Verarbeitung schneller, wenn ich verschiedene Shader für verschiedene Texturierungsmodi schreiben und zwischen ihnen wechseln würde, wenn ich sie verwenden würde? glEnable/glDisable(GL_TEXTURE_2D)?

War es hilfreich?

Lösung

Tut mir leid, aber Sie können von GLSL aus nicht auf diese Art von Status zugreifen, Punkt.

Tatsächlich müssen Sie im zukünftigen GLSL alle Formulare/Attribute selbst senden, d. h.kein automatisches gl_ModelViewMatrix, gl_LightPosition, gl_Normal oder ähnliches.Es werden nur grundlegende Dinge wie gl_Position und gl_FragColor verfügbar sein.

Das macht Ihre zweite Frage irgendwie ungültig, aber Sie können jederzeit #ifdefs verwenden, um Teile in Ihrem Shader zu aktivieren/deaktivieren, wenn Sie das bequemer finden, als separate Shader für verschiedene Texturmodi zu schreiben.

Beachten Sie bitte, dass die Verzweigung im Allgemeinen ziemlich langsam ist. Wenn Sie also Geschwindigkeit benötigen, sollten Sie sie so weit wie möglich vermeiden.(Dies ist insbesondere bei unregelmäßiger dynamischer Verzweigung von Bedeutung, da Fragmente in SIMD-Blöcken verarbeitet werden und alle Fragmente in einem Block dieselben Anweisungen berechnen müssen, auch wenn sie nur für ein oder einige Fragmente gelten.)

Andere Tipps

Eine Methode, die ich gesehen habe, ist eine 1x1-Textur mit einem einzigen Texel zu binden (1,0, 1,0, 1,0, 1,0) beim Rendern von Polygonen, die nicht texturiert sind. Ein Textur-Schalter soll billiger sein als ein Shader-Schalter und eine 1x1 Textur vollständig innerhalb der Textur-Cache passen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top