2012-05-17 15 views
5

Trong phiên bản GLSL 110 tôi có thể được phối hợp trong gl_TexCoord [] nhưng nó bị phản đối trong mã 150.Làm cách nào để phối hợp kết cấu với GLSL trong phiên bản 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(); 

Shader Code:

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

FRAGMENT:

#version 150 

in vec2 tex_coord; 

out vec4 frgcolor; 

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

màn hình cuối cùng là một quad màu đỏ.

Làm cách nào để chuyển tọa độ kết cấu thành bóng đổ? hoặc mã của tôi là sai?

Trả lời

5

Nếu bạn không muốn sử dụng các phương pháp không dùng nữa, bạn sẽ phải ngừng sử dụng glTexCoord2f và sử dụng thuộc tính tùy chỉnh.

Nếu bạn muốn ở lại với chế độ ngay lập tức, bạn sẽ sử dụng glVertexAttrib2f.

Bạn ghép này lên với biến mới của bạn 'in_coord' bởi quering chỉ số sau khi đổ bóng liên kết:

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

glBegin(GL_QUADS); 
glVertexAttrib2f(texcoord_index, 0, 0); ... 

Nếu bạn muốn sử dụng VA/VBO thay vào đó, các chức năng bạn sử dụng thay vì là glEnableVertexAttribArray/glVertexAttribPointer

+0

tks, giải quyết, tất cả để người dùng định nghĩa ... –

+4

"Nếu bạn muốn ở lại với chế độ ngay lập tức, bạn sẽ sử dụng glVertexAttrib2f." Chế độ ngay lập tức cũng được * cũng * xóa (hoặc "không được chấp nhận" nếu bạn thích), do đó, thực sự không có điểm. Hoặc bạn đang sử dụng nội dung bị xóa hoặc bạn không sử dụng; không có lý do gì để làm điều đó một nửa. –

+0

Tôi biết đây là một chủ đề rất cũ nhưng tôi chỉ muốn chỉ ra rằng có sự khác biệt giữa không được chấp nhận và bị xóa. – MJLaukala

2

trong trường hợp của bạn chỉ cần nhìn vào gl_TexCoord[0] trong trình đổ bóng đỉnh của bạn. Chắc chắn làm việc với mô hình đổ bóng 1.5

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

trong vertex:

gl_TexCoord[0]=gl_MultiTexCoord0; 

trong fragment shader:

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