แสดงผลสองวัตถุใน 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
@Tim ความผิดพลาดของฉันได้รับการแก้ไขแล้วในขณะที่ดิ้นรนเมื่อวานนี้ ฉันจะอัปเดตสิ่งนี้   -  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)


นี่เป็นวิธีการจับสลาก การประกาศสีควรอยู่นอกวิธีการวาด เว้นแต่คุณจะมีตัวแปรที่เปลี่ยนแปลง (เหมือนที่ฉันมีสิ่งนี้อยู่ในลูปการวาดเพราะฉันจะมี "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;
}

และอย่าลืมเชื่อมโยงชุดนี้อย่างถูกต้องกับวิธีการสร้างโปรแกรมของคุณ

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
programBorder ก็จำเป็นเช่นกันเนื่องจากฉันไม่ได้กำหนดตัวแปรดังกล่าว นอกจากนี้ 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 พวกเขาจะตั้งค่าตัวแปรสำหรับชุดนั้น ในกรณีของฉัน ฉันมีจำนวนมาก ดังนั้นฉันจึงวางมันไว้ในอาร์เรย์ของการแจงนับ - 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