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

8
在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();

着色器代码:

顶点-

#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;
}

片段:

#version 150

in vec2 tex_coord;

out vec4 frgcolor;

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

最终屏幕是一个红色的四边形。

如何将纹理坐标传递到着色器?或者我的代码有问题吗?

2个回答

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); ...

如果您想使用VA/VBO,您需要使用的函数是glEnableVertexAttribArray/glVertexAttribPointer。

6
如果您想继续使用即时渲染模式,您需要使用glVertexAttrib2f。即时渲染模式也已被移除(或者,如果您喜欢,可以说是“不建议使用”),因此没有意义。无论如何,您要么使用被移除的功能,要么不使用;没有理由半途而废。 - Nicol Bolas
2
我知道这是一个非常老的帖子,但我只想指出弃用和删除之间存在差异。 - MJLaukala

2

在您的情况下,只需查看顶点着色器中的gl_TexCoord [0]。在着色器模型1.5中绝对可行。

在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();

在顶点着色器中:

gl_TexCoord[0]=gl_MultiTexCoord0; 

在片段着色器中:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接