2013-08-24 104 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); 
} 

頂點:

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

我的質感和原始座標:

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遊戲編程第二版,但沒有CD,所以我不能檢查我是否編碼好,因爲只有部分代碼在書中。

+0

您是否嘗試渲染紋理座標的外觀? –

+0

在設置「活動」紋理單元之前,您正在綁定您的紋理。如果在軟件中使用多個紋理單元,那麼這可能是責任。 –

回答

1

你的代碼有幾個問題。

  1. 在片段着色器,你已經宣佈TEXCOORD0爲out,它應該是在片段着色器inout在頂點着色器,因爲它是從一個到另一個傳遞。

  2. 你正在約束你的紋理之前你設置了「active」紋理單位。它默認爲GL_TEXTURE0,但這仍然是不好的做法。

+0

我改變了它們,現在在片段着色器中,texCoord0是「in」,因爲它應該是現在它都可以工作。在綁定它之前,我也激活紋理單元。 –