2012-05-17 5 views
5

In GLSL Version 110 i [] in gl_TexCoord koordinieren lassen können, aber es in 150Wie Textur-Koordinate zu GLSL in Version 150 erhalten?

OpenGL-Code veraltet ist:

shader.setupShaderFromFile(GL_VERTEX_SHADER, "t.vert"); 
shader.setupShaderFromFile(GL_FRAGMENT_SHADER, "t.frag"); 
shader.linkProgram(); 

glGetFloatv(GL_MODELVIEW_MATRIX, modelview_mat_); 
glGetFloatv(GL_PROJECTION_MATRIX, projectionview_mat_); 

shader.begin(); 

glUniformMatrix4fv(glGetUniformLocation(shader.getProgram(), "MVMatrix"), 1, GL_FALSE, modelview_mat_); 
glUniformMatrix4fv(glGetUniformLocation(shader.getProgram(), "MPMatrix"), 1, GL_FALSE, projectionview_mat_); 

glBegin(GL_QUADS); 
    glTexCoord2f(0, 0);glVertex2f(0, 0); 
    glTexCoord2f(1, 0);glVertex2f(100, 0); 
    glTexCoord2f(1, 1);glVertex2f(100, 100); 
    glTexCoord2f(0, 1);glVertex2f(0, 100); 
glEnd(); 

shader.end(); 

Shader-Code:

Vertex-

#version 150 
in vec3 in_vertex; 
in vec2 in_coord; 
uniform mat4 MVMatrix; 
uniform mat4 MPMatrix; 

out vec2 tex_coord; 

void main() 
{ 
    vec4 v = vec4(in_vertex, 1.0); 

    tex_coord = in_coord; 
    gl_Position = MPMatrix * MVMatrix * v; 
} 

FRAGMENT:

#version 150 

in vec2 tex_coord; 

out vec4 frgcolor; 

void main() 
{ 
    frgcolor = vec4(tex_coord, 0.0, 1.0); 
} 

letzte Bildschirm ist ein rotes Viereck.

Wie Textur Koordinate an Shader übergeben? oder mein Code ist falsch?

Antwort

5

Wenn Sie die veralteten Methoden nicht verwenden möchten, müssen Sie die Verwendung von glTexCoord2f beenden und ein benutzerdefiniertes Attribut verwenden.

Wenn Sie im Sofortmodus bleiben möchten, verwenden Sie glVertexAttrib2f.

Sie dies mit Ihrem neuen Variablen paaren ‚in_coord‘ durch den Index nach Shader Verknüpfung Quering:

int program = glCreateProgram(); 
//create shader as normal 
int texcoord_index = glGetAttribLocation(program, "in_coord"); 

glBegin(GL_QUADS); 
glVertexAttrib2f(texcoord_index, 0, 0); ... 

Wenn Sie VA/VBO stattdessen verwenden möchten, ist die Funktionen, die Sie stattdessen verwenden glEnableVertexAttribArray/glVertexAttribPointer

+0

TKS, gelöst, die alle benutzerdefinierten ... –

+4

"Wenn Sie im Sofortmodus bleiben möchten, verwenden Sie glVertexAttrib2f." Der Sofortmodus wird * ebenfalls * entfernt (oder "veraltet", wenn Sie bevorzugen), also ist es wirklich sinnlos. Entweder du benutzt entfernte Sachen oder du bist nicht; Es gibt keinen Grund, es auf halbem Wege zu machen. –

+0

Ich weiß, das ist ein sehr alter Thread, aber ich wollte nur darauf hinweisen, dass es einen Unterschied zwischen veraltet und entfernt gibt. – MJLaukala

2

in Ihrem Fall nur in gl_TexCoord[0] in Ihrem Vertex-Shader suchen. Auf jeden Fall arbeitet mit Shader Model 1.5

in C++:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, id); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 

glMatrixMode(GL_TEXTURE); 
glLoadIdentity(); 

glBegin(GL_QUADS); 
    glTexCoord2f(0, 0);glVertex2f(0, 0); 
    glTexCoord2f(1, 0);glVertex2f(100, 0); 
    glTexCoord2f(1, 1);glVertex2f(100, 100); 
    glTexCoord2f(0, 1);glVertex2f(0, 100); 
glEnd(); 

in Vertex-Shader:

gl_TexCoord[0]=gl_MultiTexCoord0; 

in Fragment-Shader:

vec4 c = texture2D(texSampler, gl_TexCoord[0].st);