OpenGL+Assimp - niedziałające kolorowanie.

0

Witam,
korzystam z przykładowego kodu importującego obiekt 3D do OpenGL za pomocą biblioteki Assimp (przykład wzięty ze źródeł dostarczanych wraz z biblioteką). W kodzie praktycznie nic nie zmieniałem, jednak chciałem dorysować podłoże w jednolitym kolorze. Problem pojawia się podczas użycia funkcji glColor3f nadającej kolor narysowanemu podłożu. Niezależnie od przekazywanych jej parametrów zawsze wyświetlany jest czarny kolor. Funkcja zaczyna działać dopiero po wyłączeniu renderowania modelu. Nie potrafię dojść co jest nie tak.
Oto jak wygląda funkcja do wyświetlania:

void renderScene(void) {

	int i,j;
	float tmp;

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	// Reset transformations
	glLoadIdentity();
	// Set the camera
	gluLookAt(	x, 1.0f, z,
			x+lx, 1.0f,  z+lz,
			0.0f, 1.0f,  0.0f);

    glBegin(GL_QUADS);
        glColor3f(1.0f, 0.0f, 0.0f);
		glVertex3f(-100.0f, 0.0f, -100.0f);
		glVertex3f(-100.0f, 0.0f,  100.0f);
		glVertex3f( 100.0f, 0.0f,  100.0f);
		glVertex3f( 100.0f, 0.0f, -100.0f);
	glEnd();

    if(scene_list == 0) {
	    scene_list = glGenLists(1);
	    glNewList(scene_list, GL_COMPILE);
            // now begin at the root node of the imported data and traverse
            // the scenegraph by multiplying subsequent local transforms
            // together on GL's matrix stack.
	    recursive_render(scene, scene->mRootNode);
	    glEndList();
	}

    glCallList(scene_list);

	glutSwapBuffers();
} 

Oraz funkcja do renderowania modelu:

void recursive_render (const  aiScene *sc, const  aiNode* nd)
{
	unsigned int i;
	unsigned int n = 0, t;
	 aiMatrix4x4 m = nd->mTransformation;

	// update transform
	aiTransposeMatrix4(&m);
	glPushMatrix();
	glMultMatrixf((float*)&m);

	// draw all meshes assigned to this node
	for (; n < nd->mNumMeshes; ++n) {
		const  aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]];

		apply_material(sc->mMaterials[mesh->mMaterialIndex]);

		if(mesh->mNormals == NULL) {
			glDisable(GL_LIGHTING);
		} else {
			glEnable(GL_LIGHTING);
		}

		for (t = 0; t < mesh->mNumFaces; ++t) {
			const struct aiFace* face = &mesh->mFaces[t];
			GLenum face_mode;

			switch(face->mNumIndices) {
				case 1: face_mode = GL_POINTS; break;
				case 2: face_mode = GL_LINES; break;
				case 3: face_mode = GL_TRIANGLES; break;
				default: face_mode = GL_POLYGON; break;
			}

			glBegin(face_mode);

			for(i = 0; i < face->mNumIndices; i++) {
				int index = face->mIndices[i];
				if(mesh->mColors[0] != NULL)
					glColor4fv((GLfloat*)&mesh->mColors[0][index]);
				if(mesh->mNormals != NULL)
					glNormal3fv(&mesh->mNormals[index].x);
				glVertex3fv(&mesh->mVertices[index].x);
			}

			glEnd();
		}

	}

	// draw all children
	for (n = 0; n < nd->mNumChildren; ++n) {
		recursive_render(sc, nd->mChildren[n]);
	}

	glPopMatrix();
} 
0

Listy służą do tego, by je raz utworzyć, a potem powtarzać glCallList. nie rób glNewList/recursive_render/glEndList za każdym razem, bo to tak jakbyś nie używał listy wcale.
poza tym powodujesz wyciek zasobów, tworząc wielokrotnie nową listę.

0

Myślałem że if(scene_list == 0) załatwia sprawę i tworzenie listy wykonuje się tylko przy pierwszym uruchomieniu (nie jestem autorem tego kodu, to przykład dołączany do Assimpa). Zmiana na wywoływanie samego recursive_render bez listy nic nie zmienia. Nadal wszystko co jest rysowane poza wczytanym modelem jest czarne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1