如何在版本150中获得GLSL的纹理坐标?

g.E*_*Eis 8 shader textures glsl

在GLSL版本110中,我可以在gl_TexCoord []中获得坐标,但它在150中已弃用.

OpenGL代码:

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();
Run Code Online (Sandbox Code Playgroud)

着色器代码:

顶点-

#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;
}
Run Code Online (Sandbox Code Playgroud)

分段:

#version 150

in vec2 tex_coord;

out vec4 frgcolor;

void main()
{
    frgcolor = vec4( tex_coord, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

最终屏幕是红色四边形.

如何将纹理坐标传递给着色器?或者我的代码错了?

Tim*_*Tim 6

如果您不想使用已弃用的方法,则必须停止使用glTexCoord2f,并使用自定义属性.

如果你想保持立即模式,你将使用glVertexAttrib2f.

通过在着色器链接后查询索引,将其与新变量"in_coord"配对:

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

glBegin(GL_QUADS);
glVertexAttrib2f(texcoord_index, 0, 0); ...
Run Code Online (Sandbox Code Playgroud)

如果你想使用VA/VBO,你使用的函数是glEnableVertexAttribArray/glVertexAttribPointer

  • "如果你想保持立即模式,你将使用glVertexAttrib2f."立即模式*也被*删除(或者如果你愿意,"弃用"),所以毫无意义.要么你正在使用被移除的东西,要么你不是; 中途没有理由这样做. (5认同)
  • 我知道这是一个非常古老的线程,但我只是想指出弃用和删除之间存在差异。 (2认同)