Ändern der Farbe von einem Scheitelpunkt in einer Vertex-Shader
-
23-09-2019 - |
Frage
Ist es möglich, die Farbe eines einzelnen Vertex mit einem GLSL Vertex-Shader-Programm, auf die gleiche Art und Weise eingestellt werden, dass gl_Position die Position eines Knotens ändert?
Lösung
Für die Versionen von GLSL vor Version 1.30, mögen Sie schreiben an dem gl_FrontColor
oder gl_BackColor
Einbauten, die sind varyings zugänglich im Vertex-Shader. Lesen Sie mehr über varyings in der GLSL 1.10-Spezifikation ( http: // www .opengl.org / registry / doc / GLSLangSpec.Full.1.10.59.pdf ) mehr über sie oder die GL_ARB_vertex_shader Erweiterung Spezifikation zu lernen.
gl_FrontColor
und gl_BackColor
sind 4D-RGBA-Vektoren, die Punkt Skalare normalisiert nehmen schwimmt.
Aber dieser Wille Satz alle die Ecken zu rot, nicht nur eine Ecke. Dies liegt daran, die gleichen Vertex-Shader für alle Ecken ausgeführt wird. Wenn Sie einzelne Farben setzen, verwenden Sie glColorPointer
zusammen mit glDrawArrays
, glDrawElements
, glDrawRangeElements
oder glMultiDrawElements
. Die Vertex Farbe durch glColorPointer
einstellen als gl_Color
im Vertex-Shader gelesen werden. gl_Color
im Vertex-Shader ist ein pro-Vertex-Attribut.
Um die Farbe lesen Sie in der Vertex-Shader geschrieben, in dem Fragment-Shader, lesen Sie die eingebaute in gl_Color
variiert. Fertige Fragmente sollten gl_FragColor
geschrieben werden.
Vertex-Shader-Beispiel:
void main()
{
gl_FrontColor = gl_Color;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Fragment-Shader-Beispiel:
void main()
{
gl_FragColor = gl_Color;
}
Auch auf der Vertex-Shader machen gesetzt die varyings wie die OpenGL Fixed-Function-Pipeline, rufen Sie die Funktion ftransform ().
void main()
{
ftransform();
}