我正努力應用顏色來適應我的幾何體。當我直接在頂點着色器(「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);」
使用 「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);
如果我正確理解你的屏幕截圖,你的紋理座標有問題,而不是(或者除了)頂點顏色。實際上*在着色器中使用*頂點屬性將使其*活動*,並將更改自動分配的位置。 –