2012-05-17 42 views
5

在GLSL版本110,我可以在gl_TexCoord []得到協調,但它在150如何在150版本中獲得GLSL的紋理座標?

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

shader代碼:

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

碎片:

#version 150 

in vec2 tex_coord; 

out vec4 frgcolor; 

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

最終屏幕是紅色的四邊形。

如何將紋理座標傳遞給着色器?或者我的代碼錯了?

回答

5

如果您不想使用已棄用的方法,則必須停止使用glTexCoord2f並使用自定義屬性。

如果你想留在即時模式,你會使用glVertexAttrib2f

你與你的新變量「in_coord」由quering着色器連接後的索引對這樣使用:

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

+0

TKS,解決了,所有用戶定義的...「 –

+4

」如果您希望保持即時模式,您將使用glVertexAttrib2f。「即時模式也被*刪除(或者,如果你願意的話,「棄用」),所以沒有任何意義。要麼你正在使用刪除的東西,或者你不是;沒有理由半途而廢。 –

+0

我知道這是一個非常古老的線程,但我只想指出已棄用和已刪除的區別。 – 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);