2015-07-24 2 views
1

Вместо того, чтобы повторять одни и те же данные цвета снова и снова для каждой вершины, как применить цвет к каждой вершине? Я сохраняю координаты вершин и координаты текстуры в одном буфере, поскольку они меняются, но я хочу, чтобы цвета были одинаковыми.
Вот как я определяю одну вершину:Управление цветовыми данными в OpenGL ES 2.0

vertexData[++vOffset] = position.x; 
vertexData[++vOffset] = position.y; 
vertexData[++vOffset] = position.z; 
vertexData[++vOffset] = texture.x; 
vertexData[++vOffset] = texture.y; 
vertexData[++vOffset] = r; 
vertexData[++vOffset] = g; 
vertexData[++vOffset] = b; 
vertexData[++vOffset] = a; 

Я пытался хранить RGBA в одном флоат буфере и применяя его следующим образом:

vertexBuffer.position(0); 
GLES20.glEnableVertexAttribArray(GLShader.mPositionHandle); 
GLES20.glVertexAttribPointer(GLShader.mPositionHandle, 3, GLES20.GL_FLOAT, false, 36, vertexBuffer); 

vertexBuffer.position(3); 
GLES20.glEnableVertexAttribArray(GLShader.mTexCoordLoc); 
GLES20.glVertexAttribPointer(GLShader.mTexCoordLoc, 2, GLES20.GL_FLOAT, false, 36, vertexBuffer); 

colorBuffer.position(0); 
GLES20.glEnableVertexAttribArray(GLShader.mColorHandle); 
GLES20.glVertexAttribPointer(GLShader.mColorHandle, 4, GLES20.GL_FLOAT, false, 0, colorBuffer); 

Кроме того, как настроить шейдер так, что если цветной ввод отсутствует, по умолчанию он равен (1,1,1,1)?

ответ

0

Есть несколько вариантов. Наиболее очевидным является то, что вы используете uniform вместо значения attribute для цвета. Объявление в коде фрагмент шейдера может выглядеть следующим образом:

uniform vec4 Color; 

Затем вы устанавливаете цвет с одним из glUniform*() вызовов, как:

// One time, after shader has been linked. 
int colorLoc = GLES20.glGetUniformLocation(progId, "Color"); 

// Every time you want to change color. 
GLES20.glUniform4fv(colorLoc, colorR, colorG, colorB); 

Тем не менее, вы можете продолжать использовать атрибут, и установите его на постоянное значение, используя:

GLES20.glVertexAttrib4f(GLShader.mColorHandle, colorR, colorG, colorB); 

Чтобы использовать это, соответствующий массив вершин должен быть отключен. Поэтому, если вы ранее включили его, вам необходимо отключить его:

GLES20.glDisableVertexAttribArray(GLShader.mColorHandle);