2012-06-01 3 views
0

Im пытается добавить два объекта, которые создаются из одной части, но так как мне нужно раскрасить каждую часть, я их разделил. Я попытался сделать одну часть, которая работает, но потом я попытался отобразить обе, которая ничего не делает.Рендеринг двух объектов в OpenGL ES

 glGenVertexArraysOES(1, &_boxVAO); 
     glBindVertexArrayOES(_boxVAO); 

     int sizeOfFaces = myMesh_m.faces.size() * sizeof(ObjMeshFace); 
     glGenBuffers(1, &_boxBuffer); 
     glBindBuffer(GL_ARRAY_BUFFER, _boxBuffer); 
     glBufferData(GL_ARRAY_BUFFER, sizeOfFaces, &(myMesh_m.faces[0]), GL_STATIC_DRAW); 

     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(ObjMeshVertex), 0); 
     glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(ObjMeshVertex), (void*)(sizeof(Vector3f) + sizeof(Vector2f))); 

     glEnableVertexAttribArray(0); 
     glEnableVertexAttribArray(2); 

     sizeOfFaces = myMesh_p.faces.size() * sizeof(ObjMeshFace); 
     glGenBuffers(1, &_boxBuffer_sec); 
     glBindBuffer(GL_ARRAY_BUFFER, _boxBuffer_sec); 
     glBufferData(GL_ARRAY_BUFFER, sizeOfFaces, &(myMesh_p.faces[0]), GL_STATIC_DRAW); 

     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(ObjMeshVertex), 0); 
     glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(ObjMeshVertex), (void*)(sizeof(Vector3f) + sizeof(Vector2f))); 

     glEnableVertexAttribArray(0); 
     glEnableVertexAttribArray(2); 

     glBindVertexArrayOES(0); 

Draw:

  glBindVertexArrayOES(_boxVAO); 
      glUniform2fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, color); 
      glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, GL_FALSE, _modelViewProjectionMatrix.m); 
      glDrawArrays(GL_TRIANGLES, 0, pointerSize_m*3); 

Shader.vsh

attribute vec4 position; 
attribute vec3 normal; 

varying lowp vec4 colorVarying; 

uniform mat4 modelViewProjectionMatrix; 
uniform mat3 normalMatrix; 

void main() 
{ 
    vec3 eyeNormal = normalize(normalMatrix * normal); 
    vec3 lightPosition = vec3(1.0, 1.0, 1.0); 
    vec4 diffuseColor = vec4(1, 0.4, 1.0, 1.0); 

    float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); 

    colorVarying = diffuseColor * nDotVP; 

    gl_Position = modelViewProjectionMatrix * position; 
} 

Shader.fsh

//varying lowp vec4 colorVarying; 
uniform lowp vec4 color; 


void main() 
{ 
// gl_FragColor = colorVarying; 
    gl_FragColor = color; 

} 

Почему это терпят неудачу? Кроме того, как я цвет каждого объекта?

+1

Где ваша инициализация '_boxVAO_NEW'? Если это ваш настоящий код, вы не программируете его. – Tim

+2

ЕСЛИ какие изменения между обоими объектами - это только цвет, вам даже не нужно создавать новое VAO, просто добавьте форму в шейдер и измените значение этой формы перед каждым разным рисунком. – Pochi

+0

@ Тит, моя ошибка была исправлена ​​во время боев вчера. Я обновлю это. – JavaCake

ответ

1

Это метод рисования. Объявление цвета должно быть вне метода рисования, если у вас есть переменная, которая изменяется. (Как я это внутри цикла рисования, потому что я бы «х» вместо 200)

GLfloat color[4]; 
color[0] = 200/255.0; 
color[1] = 0.0/255.0; 
color[2] = 0.0/255.0; 
color[3] = 255.0/255.0; 

GLfloat colorOther[4]; 
color[0] = 50/255.0; 
color[1] = 0.0/255.0; 
color[2] = 0.0/255.0; 
color[3] = 255.0/255.0; 

glUseProgram(_programBorder); 
glBindVertexArrayOES(_vaoBorder); 
glUniform2fv(uniforms[UNIFORM_COLOR_BORDER], 1, color); 
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX_BORDER], 1, GL_FALSE, _modelViewProjectionMatrix.m); 
glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_SHORT, 0); 

//Modify the model projection matrix to change the position of the object 

glUniform2fv(uniforms[UNIFORM_COLOR_BORDER], 1, colorOther); 
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX_BORDER], 1, GL_FALSE, _modelViewProjectionMatrix.m); 
glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_SHORT, 0); 

фрагмент шейдера должен иметь форму, как это:

uniform lowp vec4 color; 

void main() 
{ 
    gl_FragColor = color; 
} 

И не забудьте ссылку это равномерно по вашим методам создания программы.

+0

Могу ли я спросить, что такое _programBorder и _vaoBorder? Является ли _vaoBorder только моим собственным VAO? – JavaCake

+0

programBorder - моя программа (используется в es 2), которая содержит мои фрагменты и вершинные шейдеры. – Pochi

+0

vaoBorder - это объект массива вершин, здесь вы используете свой, который должен быть установлен один раз и будет содержать вашу конфигурацию для этого типа вызова рисования. – Pochi

0

Я знаю, что это немного поздно, чтобы добавить в смесь, но я просто смотрю на ответ, и он не работает для меня - у меня был черный квадрат, но я изменил

glUniform2fv(uniforms[UNIFORM_COLOR_BORDER], 1, color); 

до

glUniform4fv(uniforms[UNIFORM_COLOR_BORDER], 1, color); 

И он работает сейчас. Должно ли это быть 4, так как есть 4 значения в цвете или мой код запутался в другом месте, что это работает? : P