Ios 在opengles中绘制两个对象

Ios 在opengles中绘制两个对象,ios,opengl-es,opengl-es-2.0,Ios,Opengl Es,Opengl Es 2.0,我试图添加两个对象,这是从一个部分创建的,但由于我需要为每个部分着色,我已将它们分开。我曾试图渲染一个有效的部分,但后来我尝试渲染两个都无效的部分 glGenVertexArraysOES(1, &_boxVAO); glBindVertexArrayOES(_boxVAO); int sizeOfFaces = myMesh_m.faces.size() * sizeof(ObjMeshFace); glGenBuffe

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

        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);
抽签:

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;

}

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

这取决于绘制方法。颜色声明应该在绘图方法之外,除非您有一个更改的变量。(就像我在绘图循环中有这个一样,因为我将使用“x”而不是200)

片段着色器必须具有如下一致性:

uniform lowp vec4 color;

void main()
{
    gl_FragColor = color;
}

别忘了在你的程序创建方法上正确地连接这件制服。

我知道添加到混合中有点晚,但我只是在看答案,它对我不起作用-我有一个黑色方块,但我改变了

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


现在它可以工作了。这应该是4,因为一种颜色中有4个值,还是我的代码在其他地方弄乱了P

在哪里初始化
\u boxVAO\u NEW
?如果这是你的真实代码,那么你就没有编写它。如果两个对象之间的变化只是颜色,你甚至不需要创建一个新的VAO,只需在着色器中添加一个统一体,并在每次不同的绘制之前更改该统一体的值。@Tim,我的错误在昨天的努力中得到纠正。我会更新的。@LuisOscar,你能给出一个代码示例吗?谢谢。@JavaCake您使用的是ES 1还是ES 2?我不知道ES 1,所以我不能帮你。如果是ES 2,那么你可以在第二次抽签前通过绑定新制服来更改。我能问一下Border和vaoBorder是什么吗?_vaoBorder只是我自己的VAO吗?programBorder是我的程序(在es 2中使用),它包含我的片段和顶点着色器。vaoBorder是顶点数组对象,在这里您使用您的对象,它应该设置一次,并将包含特定类型的绘图调用的配置。由于我没有定义这样的变量,所以programBorder是必需的。此外,
制服
不起作用,缺少库?这只是一个结构。。。使用opengl es 2模板创建一个新的xcode项目,您可以在那里看到所有这些元素。
uniform lowp vec4 color;

void main()
{
    gl_FragColor = color;
}
glUniform2fv(uniforms[UNIFORM_COLOR_BORDER], 1, color);
glUniform4fv(uniforms[UNIFORM_COLOR_BORDER], 1, color);