Ich versuche herauszufinden, wie man Texturzuordnung unter Verwendung von GLSL Version 4.10 macht. Ich bin ziemlich neu in GLSL und war heute glücklich, ein Dreieck mit Farben gerendert zu haben, die basierend auf sin (Zeit) verblassen, das mit Shadern verwendet wurde. Jetzt interessiere ich mich dafür, Shader mit einer einzigen Textur zu verwenden.
Viele Tutorials und sogar Antworten auf Stack Overflow schlagen vor, gl_MultiTexCoord0 zu verwenden. Das wurde jedoch seit GLSL 1.30 veraltet und die neueste Version ist jetzt 4.20. Meine Grafikkarte unterstützt kein 4.20, deshalb versuche ich 4.10 zu verwenden.
Ich weiß, dass ich meine Textur richtig generiere und binde und habe passende Eckpunktkoordinaten und Texturkoordinaten, da meine Höhenkarte perfekt gerendert wurde, als ich die Fixed-Function-Pipeline verwendet habe, und sie mit Farbe anstelle der Textur gut gerendert wird.
Hier sind meine GLSL-Shader und ein Teil meines C++-Zeichencodes:
---heightmap.vert (GLSL)---
in vec3 position;
in vec2 texcoord;
out vec2 p_texcoord;
uniform mat4 projection;
uniform mat4 modelview;
void main(void)
{
gl_Position = projection * modelview * vec4(position, 1.0);
p_texcoord = texcoord;
}
---heightmap.frag (GLSL)---
in vec2 p_texcoord;
out vec4 color;
uniform sampler2D texture;
void main(void)
{
color = texture2D(texture, p_texcoord);
}
---Heightmap::Draw() (C++)---
// Bind Shader
// Bind VBO + IBO
// Enable Vertex and Texcoord client state
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
// glVertexPointer(...)
// glTexCoordPointer(...)
glUniform4fv(projLoc, projection);
glUniform4fv(modelviewLoc, modelview);
glUniform1i(textureId, 0);
// glDrawElements(...)
// glDisable/unbind everything
Das, worüber ich auch misstrauisch bin, ist, ob ich die Texturkoordinaten an den Fragment-Shader als Varying übergeben muss, da ich sie im Vertex-Shader nicht berühre. Außerdem habe ich keine Ahnung, wie es die interpolierten Texturkoordinaten bekommen wird. Es scheint, als würde es einfach 0.f oder 1.f erhalten, nicht die interpolierte Koordinate. Ich weiß nicht genug über Shader, um zu verstehen, wie das funktioniert. Wenn mich jemand aufklären könnte, wäre ich begeistert!
Bearbeitung 1:
@Bahbar: Entschuldigung, das war ein Tippfehler. Ich tippe Code auf einem Gerät, während ich ihn auf einem anderen lese. Wie ich sagte, hat alles mit der Fixed Function Pipeline funktioniert. Obwohl glEnableClientState und gl[Vertex|TexCoord]Pointer veraltet sind, sollten sie immer noch mit Shadern funktionieren, oder? glVertexPointer anstelle von glVertexAttribPointer hat mit Farben anstelle von Texturen funktioniert. Außerdem verwende ich glBindAttribLocation (position auf 0 und texcoord auf 1).
Der Grund, warum ich immer noch glVertexPointer verwende, ist, dass ich versuche, nach und nach eine Sache zu veralten.