【问题标题】:How to get texture coordinate to GLSL in version 150?如何在 150 版中获取纹理坐标到 GLSL?
【发布时间】:2012-05-17 16:07:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: glsl shader textures


    【解决方案1】:

    如果您不想使用已弃用的方法,则必须停止使用 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

    【讨论】:

    • "如果你想继续使用即时模式,你将使用 glVertexAttrib2f。" 即时模式被移除(或者如果你愿意,也可以“弃用”),所以真的有没有意义。要么您使用已删除的东西,要么您没有;没有理由半途而废。
    • 我知道这是一个非常古老的线程,但我只是想指出已弃用和已删除之间存在差异。
    【解决方案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 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 2012-04-06
      • 2015-09-30
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多