Merender dua objek di OpenGL ES

Saya mencoba menambahkan dua objek, yang dibuat dari satu bagian, tetapi karena saya perlu mewarnai setiap bagian, saya memisahkannya. Saya telah mencoba merender satu bagian yang berfungsi, tetapi setelah itu saya mencoba merender keduanya namun tidak menghasilkan apa-apa.

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

Menggambar:

            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;

}

Mengapa ini gagal? Selanjutnya bagaimana cara mewarnai setiap objek?


person JavaCake    schedule 01.06.2012    source sumber
comment
Di mana inisialisasi _boxVAO_NEW Anda? Jika itu adalah kode asli Anda maka Anda tidak memprogramnya.   -  person Tim    schedule 02.06.2012
comment
JIKA yang berubah di antara kedua objek hanyalah warnanya, Anda bahkan tidak perlu membuat VAO baru, cukup tambahkan seragam ke dalam shader dan ubah nilai seragam tersebut sebelum setiap pengundian yang berbeda.   -  person Pochi    schedule 02.06.2012
comment
@Tim, kesalahan saya telah diperbaiki saat berjuang kemarin. Saya akan memperbarui ini.   -  person JavaCake    schedule 02.06.2012
comment
@LuisOscar, bisakah Anda memberikan contoh kode? Terima kasih.   -  person JavaCake    schedule 02.06.2012
comment
@JavaCake apakah Anda menggunakan ES 1 atau ES 2? Saya tidak tahu tentang ES 1 jadi saya tidak dapat membantu Anda di sana. jika ES 2 maka anda menggantinya dengan mengikat seragam baru sebelum pengundian kedua.   -  person Pochi    schedule 02.06.2012
comment
@LuisOscar, saya menggunakan ES 2 dalam kasus ini..   -  person JavaCake    schedule 02.06.2012
comment
Lalu ya dan itu cukup mudah, periksa jawaban saya   -  person Pochi    schedule 02.06.2012


Jawaban (2)


Ini berlaku pada metode undian. Deklarasi warna harus berada di luar metode gambar kecuali Anda memiliki variabel yang berubah. (Seperti saya memiliki ini di dalam lingkaran gambar karena saya akan memiliki "x" bukannya 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);

Fragmen shader harus memiliki seragam seperti ini:

uniform lowp vec4 color;

void main()
{
    gl_FragColor = color;
}

Dan jangan lupa untuk menghubungkan seragam ini dengan benar pada metode pembuatan program Anda.

person Pochi    schedule 02.06.2012
comment
Bolehkah saya bertanya apa itu _programBorder dan _vaoBorder? Apakah _vaoBorder hanyalah VAO saya sendiri? - person JavaCake; 02.06.2012
comment
programBorder adalah program saya (digunakan di es 2) yang berisi fragmen dan vertex shader saya. - person Pochi; 02.06.2012
comment
vaoBorder adalah objek array vertex, di sini Anda menggunakan milik Anda, yang harus disetel satu kali dan akan berisi konfigurasi Anda untuk jenis panggilan draw tertentu. - person Pochi; 02.06.2012
comment
Begitu juga dengan programBorder yang diperlukan karena saya belum mendefinisikan variabel tersebut. Selanjutnya uniforms tidak berfungsi, perpustakaan hilang? - person JavaCake; 02.06.2012
comment
Itu hanya sebuah struktur... Buat proyek xcode baru menggunakan template opengl es 2, Anda dapat melihat semua elemen di sana. - person Pochi; 02.06.2012
comment
Saya telah mencoba templatnya tetapi UNIFORM_COLOR_BORDER atau UNIFORM_MODELVIEWPROJECTION_MATRIX_BORDER tidak digunakan. Dengan kata lain mereka menimbulkan masalah. - person JavaCake; 02.06.2012
comment
Karena ini hanyalah petunjuk ke yang Anda atur selama pembuatan program. Pada template gulir ke metode loadshader, di sana mereka mengatur variabel untuk seragam itu. Dalam kasus saya, saya punya banyak jadi saya menempatkannya dalam array enum. - person Pochi; 02.06.2012
comment
Mirip dengan uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX] = glGetUniformLocation(_program, "modelViewProjectionMatrix"); uniforms[UNIFORM_NORMAL_MATRIX] = glGetUniformLocation(_program, "normalMatrix"); sehingga membingungkan saya bagaimana saya harus menangani kedua variabel tersebut. - person JavaCake; 02.06.2012
comment
Lihat headernya, seperti yang saya katakan, itu hanyalah enum dari GLint. Anda bisa menambahkan sesuatu seperti GLint modelmatrix; pada header dan modelmatrix = glGetUniformLocation(_program, modelViewProjectionMatrix); pada kode loadshader. - person Pochi; 02.06.2012
comment
Sejauh ini objek saya masih berwarna hitam. Haruskah aku melakukan sesuatu dengan Shader.vshku? Kode utama diperbarui.. - person JavaCake; 02.06.2012

Saya tahu ini agak terlambat untuk ditambahkan ke dalam campuran, tetapi saya hanya melihat jawabannya dan itu tidak berhasil untuk saya - Saya memiliki kotak hitam, namun saya mengubahnya

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

to

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

Dan itu berhasil sekarang. Haruskah ini 4, karena ada 4 nilai dalam satu warna atau apakah kode saya kacau di tempat lain sehingga ini berfungsi? :P

person Paul Reed    schedule 01.06.2013