在OpenGL ES中渲染两个对象

时间:2012-06-01 15:05:41

标签: ios opengl-es opengl-es-2.0

我试图添加两个对象,这是从一个部分创建的,但由于我需要为每个部分着色,我已将它们分开。我试图渲染一个有效的部分,但我后来尝试渲染两个没有渲染的部分。

        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;

}

为什么这会失败?此外,我如何着色每个对象?

2 个答案:

答案 0 :(得分:1)

这是绘制方法。除非您有一个更改的变量,否则颜色声明应该在绘图方法之外。 (就像我在绘图循环中有这个,因为我会有“x”而不是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;
}

并且不要忘记在程序创建方法上正确地连接这个制服。

答案 1 :(得分:0)

我知道这有点晚了加入混音,但我只是看着答案,它对我不起作用 - 我有一个黑色方块,但是我改变了

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

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

它现在有效。这应该是4,因为一个颜色中有4个值,或者我的代码搞砸到其他地方这是有效的吗? :P