Problem med vertex arrays i OpenGL

Permalänk
Medlem

Problem med vertex arrays i OpenGL

Jag tänkte använda mig utav vertex arrays i ett program istället för imidiate mode, men jag får det inte att fungera.
Min imidiate mode-kod som fungerar är:

glBegin(GL_TRIANGLES); calcVect1(x, z, step, vec1, vec2, vec3); calcVectNorm(vec1, vec2, vec3, &normx, &normy, &normz); glNormal3f(normx, normy, normz); glVertex3i(x, getHeight(x, z, 0), z); glVertex3i(x, getHeight(x, z + step,0), z + step); glVertex3i(x + step, getHeight(x + step, z + step,0), z + step); calcVect2(x, z, step, vec1, vec2, vec3); calcVectNorm(vec1, vec2, vec3, &normx, &normy, &normz); glNormal3f(normx, normy, normz); glVertex3i(x + step, getHeight(x + step, z + step,0), z + step); glVertex3i(x + step, getHeight(x + step, z,0), z); glVertex3i(x, getHeight(x, z, 0), z); glEnd();

Medan min vertex array-kod som inte fungerar ser ut så här:

calcVect1(x, z, step, vec1, vec2, vec3); calcVectNorm(vec1, vec2, vec3, &normx, &normy, &normz); float indices[18] = {x, getHeight(x, z, 0), z, x, getHeight(x, z + step,0), z + step, x + step, getHeight(x + step, z + step,0), z + step, x + step, getHeight(x + step, z + step,0), z + step, x + step, getHeight(x + step, z,0), z, x, getHeight(x, z, 0), z}; vertices[0][0] = 0; vertices[0][1] = 1; vertices[0][2] = 2; normals[0][0] = normx; normals[0][1] = normy; normals[0][2] = normz; calcVect2(x, z, step, vec1, vec2, vec3); calcVectNorm(vec1, vec2, vec3, &normx, &normy, &normz); vertices[1][0] = 3; vertices[1][1] = 4; vertices[1][2] = 5; normals[1][0] = normx; normals[2][1] = normy; normals[3][2] = normz; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT, 0, normals); glDrawElements(GL_TRIANGLES, 18, GL_UNSIGNED_BYTE, indices); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY);

Här är en skärmdump, vänster imidiate mode och höger mitt försök till vertex arrays.

Permalänk

Vad jag kan se så har du förväxlat indices med vertices i din vertex array.

vertices ska innehålla vertex positionerna (x,y,z) och indices ska ha index till dessa så att man kan använda en vertex flera gånger utan att behöva skriva in vertexdatan flera gånger.

så indices bör se ut något som följande

mIndices[] ={0,4,3,2,4,5};

Permalänk
Medlem
Skrivet av swedish-hero:

Vad jag kan se så har du förväxlat indices med vertices i din vertex array.

Ja det verkar jag ha gjort. Jag har ändrat koden till:

calcVect1(x, z, step, vec1, vec2, vec3); calcVectNorm(vec1, vec2, vec3, &normx, &normy, &normz); GLfloat vertices[6][3] = {{x, getHeight(x, z, 0)}, {z, x, getHeight(x, z + step,0), z + step}, {x + step, getHeight(x + step, z + step,0), z + step}, {x + step, getHeight(x + step, z + step,0), z + step}, {x + step, getHeight(x + step, z,0), z}, {x, getHeight(x, z, 0), z}}; normals[0][0] = normx; normals[0][1] = normy; normals[0][2] = normz; calcVect2(x, z, step, vec1, vec2, vec3); calcVectNorm(vec1, vec2, vec3, &normx, &normy, &normz); normals[1][0] = normx; normals[1][1] = normy; normals[1][2] = normz; GLfloat indices[6] = {0,1,2, 3,4,5}; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT, 0, normals); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY);

Men nu så syns ingenting.

Skrivet av swedish-hero:

så indices bör se ut något som följande

mIndices[] ={0,4,3,2,4,5};

Om jag vill skapa trianglarna som i imidiate mode-fallet borde inte indices vara {0, 1,2, 3,4,5}?
I glDrawElements ändrade jag en parameter till 6, då jag har 2 trianglar med 3 vertex var, är det rätt tänkt?

Permalänk
Medlem

Indices är någon form av ints, inte floats. Du säger ju tydligt till GL att det du skickar in är unsigned char (GL_UNSIGNED_BYTE).

Byt ut din index-deklaration mot

unsigned char indices[] = {0, 1, 2, 3, 4, 5};

Du kan även återanvända vertices, spelar inte så stor roll i just detta fall men i större modeller är det viktigt. {0, 1, 2, 0, 2, 3 } förutsatt att din vertexlista skrivs om att fungera med detta

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem
Skrivet av jdv:

Indices är någon form av ints, inte floats. Du säger ju tydligt till GL att det du skickar in är unsigned char (GL_UNSIGNED_BYTE).

Byt ut din index-deklaration mot

unsigned char indices[] = {0, 1, 2, 3, 4, 5};

Du kan även återanvända vertices, spelar inte så stor roll i just detta fall men i större modeller är det viktigt. {0, 1, 2, 0, 2, 3 } förutsatt att din vertexlista skrivs om att fungera med detta

Det har du rätt i.

Jag ändrat koden till:

calcVect1(x, z, step, vec1, vec2, vec3); calcVectNorm(vec1, vec2, vec3, &normx, &normy, &normz); GLfloat vertices[4][3] = {{x, getHeight(x, z, 0), z} {x, getHeight(x, z + step,0), z + step}, {x + step, getHeight(x + step, z + step,0), z + step}, {x + step, getHeight(x + step, z,0), z}}; normals[0][0] = normx; normals[0][1] = normy; normals[0][2] = normz; calcVect2(x, z, step, vec1, vec2, vec3); calcVectNorm(vec1, vec2, vec3, &normx, &normy, &normz); normals[1][0] = normx; normals[1][1] = normy; normals[1][2] = normz; GLubyte indices[6] = {0,1,2, 2,3,0}; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT, 0, normals); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY);

Och nu blir resultatet det till höger på bilden nedan.

Mycket bättre, men det verkar vara något fel med normalvektorerna.
Jag tror inte det är mina calcVect- och calcVectNorm-funktioner det är fel på då de fungerar i imidiate mode.

Permalänk
Medlem

Du måste ha lika många normaler som du har vertices. Normal-arrayen kommer att indexeras med samma indices som vertex-arrayen.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem

La till mer normalvektorer och nu fungerar det.
Tack för hjälpen!