☰ Menu

Scene.hu

Magyar demoscene portál – grafikusok, zenészek, programozók alkotói közössége

Home Forums A Demokészítés művészete Programozás Segítség, kezdőknek! Válasz erre: Válasz erre: Válasz erre: Segítség, kezdőknek!

#23810
avatarEdward
Member

Sziasztok!
Egy kis segítséget/tanácsot szeretnék kérni.
Adott egy bináris modell formátum. Saját formátum, én írtam az exporter-t hozzá Blender-hez. A formátum támogat több objektumból álló modelleket is és minden objektum külön textúrával rendelkezik. Írtam hozzá betöltőt/megjelenítőt is ami VBO-t használ, de shadere-eket még nem. Ezzel nincs is gond, működik rendesen.
Ezt követően átalakítottam a modell osztályomat, hogy shader-t használjon. A textúra viszont elég érdekesen jelenik meg rajta:
screenshot
Az ablak kezeléshez SDL 1.2-t használok, bár nem hiszem, hogy ez gond lenne. Ami nem igazán világos nekem, hogy ha összetett modellt akarunk kirajzolni, akkor mi a bevett szokás? Google-el próbáltam keresni példákat, leírást stb, de mindenütt csak egyszerűbb, egy objektumos példák vannak. Lehet csak nem a megfelelő módon kerestem…
A vertex-eket jól jeleníti meg, körbe is tudok menni, kamera kezelés meg van oldva. A shader-ek is jók, mert egy egyszerű kockát jól jelenít meg. Ez alapján a tutoriál alapján csináltam:
opengl-tutorial.org
Ez lenne a metódus, ami kirajzolja a modellt:

void CModel::draw(glm::mat4 &MVP)
{
glActiveTexture(GL_TEXTURE0);
for(unsigned int i=0; i<m_numObjects; i++)
{
glUseProgram(m_programID);
unsigned int matrixUniform = glGetUniformLocation(m_programID, "MVP");
unsigned int textureUniform = glGetUniformLocation(m_programID, "myTextureSampler");
glUniformMatrix4fv(matrixUniform, 1, GL_FALSE, &MVP[0][0]);
glBindTexture(GL_TEXTURE_2D, m_textureIDs[i]);
glUniform1i(textureUniform, 0);
glBindBuffer(GL_ARRAY_BUFFER, m_bufferIDs[i]);
// vertices
glEnableVertexAttribArray(0);
glVertexAttribPointer(
0, // must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
sizeof(float)*8, // stride
(void*)0 // array buffer offset
);
// UVs
glEnableVertexAttribArray(1);
glVertexAttribPointer(
1,
2,
GL_FLOAT,
GL_FALSE,
sizeof(float)*8,
(void*)6
);
glDrawArrays(GL_TRIANGLES, 0, m_numElements[i]);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glUseProgram(0);
}
}

Ugrás a lap tetejére Ugrás a lap aljára