openGL - vertex-shader

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Mein Projekt wächst und wächst. Mittlerweile habe ich in meinen Modelldateien schon so viel implementieren können, dass ich richtig stolz bin!

Nun habe ich jedoch etwas gesehen, was mir viel Arbeit erleichtern würde. In einem Video sieht man, dass die Vertices bei gleicher Textur ihre Farben ändern können, also dass der Rotton stark ansteigt, usw. Das spart viele unnötige Texturen.

Bisschen Forschen hat ergeben, dass es sich dabei angeblich (!) um Vertexshading handelt. Ok, klingt nett, sagt mir aber nichts. Ich hab einfach Vertices und für jeden Vertex einen unsigned int mit Farbe und Alpha. Google hat was von der Shading Language erzählt, aber das würde bedeuten, dass ich ja dann immer bei neuen Shadern ein komplett neues "Programm" schreiben muss.

Gibt es in OpenGL die Möglichkeit bei Vertices, die ich über glDrawElements zeichne für jeden Vertex eine Farbkomponente mitzugeben?

Gruss
Cromon
 
Gibt es in OpenGL die Möglichkeit bei Vertices, die ich über glDrawElements zeichne für jeden Vertex eine Farbkomponente mitzugeben?
Ja. Beispiel:
C:
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glColorPointer(4, GL_UNSIGNED_INT, 0, colors); 
glVertexPointer(3, GL_FLOAT, 0, positions);

glDrawElements(GL_TRIANGLES, num_elements, GL_UNSIGNED_INT, indices);

Grüße, Matthias
 
Hallo Matthias!

Danke für den Hinweis, ich habe vor lauter Shader vergessen nach dem zu suchen, worum es mir ja eigentlich geht, nämlich die Farben ;).

Das funktioniert soweit ganz gut, allerdings fehlt mir da in der Darstellung noch eine Komponente. Ich möchte nämlich mit den Werten auch verstärken können. Also gedacht ist es so (hab ich mir von WoW abgeguckt):
0x7F -> 1.0
0x00 -> 0.0
0xFF -> 2.0

also wenn ich für einen Vertex die folgende Information habe:
0x7FFF007F

bedeutet das folgendes:
1. Endalphawert soll so bleiben, wie er ist.
2. Endrotwert (nach Blend mit allen Texturen) soll * 2 gerechnet werden (und natürlich % 255)
3. Endgrünwert soll * 0 gerechnet werden
4. Endblauwert soll so bleiben wie er ist

Gibt es auch eine Möglichkeit das umzusetzen? Denn ich habe glColor3f(1.0, 1.0, 1.0) standardmässig drin, sonst ist alles viel zu dunkel und noch heller geht ja leider kaum.

Gruss
Cromon
 
Zuletzt bearbeitet:
Hallo,

du könntest die Szene zuerst mit allen Texturen rendern und in einem zweiten Pass ein multiplikatives Blending mit den Farbwerten durchführen (glBlendFunc(GL_DST_COLOR, GL_ZERO);).

Grüße, Matthias
 
Zurück