Рендеринг двух объектов в 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);

Рисовать:

            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;

}

Почему это не удается? Кроме того, как мне раскрасить каждый объект?


person JavaCake    schedule 01.06.2012    source источник
comment
Где ваша инициализация _boxVAO_NEW? Если это ваш реальный код, то вы его не программируете.   -  person Tim    schedule 02.06.2012
comment
ЕСЛИ между обоими объектами меняется только цвет, вам даже не нужно создавать новый VAO, просто добавьте юниформу в шейдер и измените значение этой униформы перед каждым другим отрисовкой.   -  person Pochi    schedule 02.06.2012
comment
@ Тим, моя ошибка была исправлена ​​во время вчерашней борьбы. Я обновлю это.   -  person JavaCake    schedule 02.06.2012
comment
@LuisOscar, можешь привести пример кода? Спасибо.   -  person JavaCake    schedule 02.06.2012
comment
@JavaCake вы используете ES 1 или ES 2? Я понятия не имею о ES 1, поэтому я не могу вам помочь. если это ES 2, то вы меняете его, привязывая новую форму до второго розыгрыша.   -  person Pochi    schedule 02.06.2012
comment
@LuisOscar, в данном случае я использую ES 2..   -  person JavaCake    schedule 02.06.2012
comment
Тогда да, и это довольно просто, проверьте мой ответ   -  person Pochi    schedule 02.06.2012


Ответы (2)


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

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

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

person Pochi    schedule 02.06.2012
comment
Могу я спросить, что такое _programBorder и _vaoBorder? Является ли _vaoBorder только моим собственным VAO? - person JavaCake; 02.06.2012
comment
ProgramBorder — это моя программа (используемая в es 2), которая содержит мои фрагментные и вершинные шейдеры. - person Pochi; 02.06.2012
comment
vaoBorder — это объект массива вершин, здесь вы используете свой, который должен быть установлен один раз и будет содержать вашу конфигурацию для этого конкретного типа вызова отрисовки. - person Pochi; 02.06.2012
comment
Итак, необходима ли программаBorder, поскольку я не определил такую ​​​​переменную. Кроме того, uniforms не работает, отсутствует библиотека? - person JavaCake; 02.06.2012
comment
Это просто структура... Создайте новый проект xcode, используя шаблон opengl es 2, вы можете увидеть все эти элементы там. - person Pochi; 02.06.2012
comment
Я попробовал шаблон, но ни UNIFORM_COLOR_BORDER, ни UNIFORM_MODELVIEWPROJECTION_MATRIX_BORDER не используются. Другими словами, они создают проблемы. - person JavaCake; 02.06.2012
comment
Потому что это всего лишь указатели на те, которые вы установили при создании своей программы. В шаблоне перейдите к методу loadshaders, там они устанавливают переменную для этого юниформа. В моем случае их много, поэтому я поместил их в массив enum. - person Pochi; 02.06.2012
comment
Подобно uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX] = glGetUniformLocation(_program, "modelViewProjectionMatrix"); uniforms[UNIFORM_NORMAL_MATRIX] = glGetUniformLocation(_program, "normalMatrix");, поэтому меня смущает, как я должен обращаться с этими двумя переменными. - person JavaCake; 02.06.2012
comment
Посмотрите на заголовок, как я уже сказал, это просто перечисление GLint. Вы можете просто добавить что-то вроде GLint modelmatrix; в заголовке и modelmatrix = glGetUniformLocation(_program, modelViewProjectionMatrix); в коде нагрузочного шейдера. - person Pochi; 02.06.2012
comment
Пока мой объект все еще черный. Должен ли я делать что-нибудь с моим Shader.vsh? Обновлен основной код.. - person JavaCake; 02.06.2012

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

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

to

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

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

person Paul Reed    schedule 01.06.2013