2014-05-25 73 views
5

我正努力應用顏色來適應我的幾何體。當我直接在頂點着色器(「varColor = vec4(1.0,0.5,0.4,1.0);」)中指定它時 - 一切正常。但是如果我使用「vColor」的顏色值 - 所有的東西都會搞砸了。OpenGL ES 2.0未能正確指定顏色屬性

增加了一些截圖來說明我的意思

有人可以幫我找出我做錯了,或點我在正確的方向?謝謝。

使用「varColor = vec4(1.0,0.5,0.4,1.0);」 Using "varColor = vec4(1.0, 0.5, 0.4, 1.0);"

使用 「varColor = vColor」 Using "varColor = vColor"

頂點着色器:

precision mediump float; 

uniform mat4 modelViewProjectionMatrix; 

attribute vec4 vPosition; 
attribute vec2 vTexCoord; 
attribute vec4 vColor; 

varying lowp vec4 varColor; 
varying mediump vec2 varTexCoord; 

void main() 
{ 
    gl_Position = modelViewProjectionMatrix * vPosition; 
    varTexCoord = vTexCoord; 
// varColor = vColor; 
    varColor = vec4(1.0, 0.5, 0.4, 1.0); 
} 

片段着色器:

precision mediump float; 

uniform sampler2D Texture0; 

varying vec4 varColor; 
varying vec2 varTexCoord; 

void main() 
{ 
    gl_FragColor = texture2D(Texture0, varTexCoord) * varColor; 
} 

着色器鏈接後,我結合我的屬性就像這樣:

mMatrixMVP = glGetUniformLocation(mProgramId, "modelViewProjectionMatrix"); 

glBindAttribLocation(mProgramId, 0, "vPosition"); 
glBindAttribLocation(mProgramId, 1, "vTexCoord"); 
glBindAttribLocation(mProgramId, 2, "vColor"); 

mTexture = glGetUniformLocation(mProgramId, "Texture0"); 
glUniform1i(mTexture, 0); 

結構中保存我的頂點信息:

struct Vertex 
{ 
    float   xyz[3]; 
    float   st[2]; 
    unsigned char color[4]; // All assigned to value of 255 
}; 

渲染時,頂點緩存勢必後,我設置頂點屬性是這樣的:

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) offsetof(Vertex, xyz)); 

glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) offsetof(Vertex, st)); 

glEnableVertexAttribArray(2); 
glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), (GLvoid*) offsetof(Vertex, color)); 

glActiveTexture(GL_TEXTURE0); 
pTexture->Bind(); // Just a "glBindTexture(GL_TEXTURE_2D, mTextureId);" 
glUniform1i(mpCurrentShader->GetTexture(), 0); 

在此之後,我綁定索引緩衝區並調用「glDrawElements」。

然後調用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);並禁用所有以「glDisableVertexAttribArray」終於屬性 - 呼叫glBindBuffer(GL_ARRAY_BUFFER, 0);

+0

如果我正確理解你的屏幕截圖,你的紋理座標有問題,而不是(或者除了)頂點顏色。實際上*在着色器中使用*頂點屬性將使其*活動*,並將更改自動分配的位置。 –

回答

3

您需要之前,讓您的來電glBindAttribLocation()鏈接着色器程序。

如果您鏈接的程序沒有在着色器代碼中指定glBindAttribLocation()layout限定符的屬性位置,則會在着色器程序鏈接時自動分配屬性位置。如果在鏈接程序後調用glBindAttribLocation(),新的位置只有在重新連接着色器程序時纔會生效。

+0

感謝Reto Koradi,你是對的! – Gediminas