如何在版本150中获得GLSL的纹理坐标?
在GLSL版本110中,我可以在gl_TexCoord[]中获得坐标,但在150中它已被弃用 OpenGL代码:如何在版本150中获得GLSL的纹理坐标?,glsl,shader,textures,Glsl,Shader,Textures,在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_); glGetF
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);
}
最后一个屏幕是红色的四边形
如何将纹理坐标传递给着色器?或者我的代码错了?如果不想使用不推荐使用的方法,则必须停止使用glTexCoord2f,并使用自定义属性
如果您想保持即时模式,您将使用 通过在着色器链接后查询索引,将其与新变量“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,则改用的函数是GlenableVertexAttributeArray/GlVertexAttributePointer在您的情况下,只需查看顶点着色器中的
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 );
“如果您想继续使用即时模式,您将使用glVertexAttrib2f。”即时模式也将被删除(或者如果您愿意,“不推荐使用”),因此没有任何意义。要么你正在使用移除的东西,要么你没有;没有理由半途而废。我知道这是一个非常旧的线程,但我只想指出,弃用和删除之间有区别。