2013-08-24 3 views
1

Недавно я начал изучать GLSL, и теперь у меня проблема с текстурированием. Я прочитал все темы об этом, я нашел ту же проблему с целым цветом, но возникла другая проблема, вызвавшая это. Итак, у меня есть простой четырехугольник (земля), и я просто хочу отобразить на нем текстуру травы. Шейдеры:GLSL/OpenGL - одиночный цвет вместо текстуры

Фрагмент:

#version 330 

uniform sampler2D color_texture; 

in vec4 color; 
out vec2 texCoord0; 

void main() 
{ 
gl_FragColor = color+texture(color_texture,texCoord0.st); 
} 

Vertex:

#version 330 
uniform mat4 projection_matrix; 
uniform mat4 modelview_matrix; 

in vec3 a_Vertex; 
in vec3 a_Color; 
in vec2 a_texCoord0; 

out vec4 color; 
out vec2 texCoord0; 

void main() 
{    
texCoord0 = a_texCoord0; 
gl_Position = (projection_matrix * modelview_matrix) * vec4(a_Vertex, 1.0); 
color = vec4(a_Color,0.3); 
} 

Моя текстура и примитивные COORDS:

static GLint m_primcoords[12]= 
{0,0,0, 
0,0,100, 
100,0,100, 
100,0,0}; 
static GLfloat m_texcoords[8]= 
{0.0f,0.0f, 
0.0f,1.0f, 
1.0f,1.0f, 
1.0f,0.0f}; 

Буферы:

glBindBuffer(GL_ARRAY_BUFFER,vertexcBuffer); 
glBufferData(GL_ARRAY_BUFFER,sizeof(GLint)*12,m_primcoords,GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER,colorBuffer); 
glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*12,m_colcoords,GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER,textureBuffer); 
glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*8,m_texcoords,GL_STATIC_DRAW); 

и мой метод рендеринга:

GLfloat modelviewMatrix[16]; 
GLfloat projectionMatrix[16]; 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 

cameraMove(); 

GLuint texturegrass = ploadtexture("grass.BMP"); 
glBindTexture(GL_TEXTURE_2D, texturegrass); 

glGetFloatv(GL_MODELVIEW_MATRIX,modelviewMatrix); 
glGetFloatv(GL_PROJECTION_MATRIX,projectionMatrix); 

shaderProgram->sendUniform4x4("modelview_matrix",modelviewMatrix); 
shaderProgram->sendUniform4x4("projection_matrix",projectionMatrix); 

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glEnableVertexAttribArray(2); 

glActiveTexture(GL_TEXTURE0); 
shaderProgram->sendUniform("color_texture",0); 

glBindBuffer(GL_ARRAY_BUFFER,colorBuffer); 
glVertexAttribPointer((GLint)1,3,GL_FLOAT,GL_FALSE,0,0); 

glBindBuffer(GL_ARRAY_BUFFER,textureBuffer); 
glVertexAttribPointer((GLint)2,2,GL_FLOAT,GL_FALSE,0,(GLvoid*)m_texcoords); 

glBindBuffer(GL_ARRAY_BUFFER,vertexcBuffer); 
glVertexAttribPointer((GLint)0,3,GL_INT,GL_FALSE,0,0); 

glDrawArrays(GL_QUADS,0,12); 

Итак, это выглядит как код только читает 4 пикселя из моей текстуры (углов) и выходной цвет будет outColor = ctopleft+ctopright+cbotleft+cbotright, как это. Я посылаю больше кода, если вы хотите, но я думаю, что проблема лежит за этими строками. Я пробовал разные координаты, заказывал, все. Я также прочитал почти все темы о таких проблемах. Я использую начальное программирование игры ogl 2nd ed., Но у меня нет cd, поэтому я не могу проверить, хорошо ли я кодирую, потому что в этой книге есть только части кодов.

+0

Вы попробовали визуализацию того, как выглядят координаты текстуры? –

+0

Вы привязываете свою текстуру перед установкой «активной» единицы текстуры. Если вы используете несколько единиц текстуры в своем программном обеспечении, это может быть виновато. –

ответ

1

Есть пара проблем с вашим кодом.

  1. В пиксельный шейдер, вы объявили texCoord0 в out, он должен быть in в пиксельный шейдер и out в вершинном шейдере, поскольку она передается от одного к другому.

  2. Вы привязываете свою текстуру до, вы устанавливаете «активную» текстуру. По умолчанию он равен GL_TEXTURE0, но это по-прежнему плохая практика.

+0

Я изменил их, теперь в шейдере фрагмента texCoord0 «находится», как и должно быть, и теперь все работает. Я также активирую блок текстуры, прежде чем связывать его. –

Смежные вопросы