示例#1
0
void recursiveRender(context *scene) {// bind the texture
	mvpStack.push();
	mvpStack->matrix() *= scene->transformation.matrix();
	if (scene->texture != 0) {
		glUniform1i(glGetUniformLocation(shader.id(),"ColorTex"), 0);
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D,textures[scene->texture]);

		// draw the texture
		glBindVertexArray(vertexArrayID);
		glUniformMatrix4fv(glGetUniformLocation(shader.id(), "mvp"), 1, GL_FALSE, mvpStack->data());
		glDrawArrays(GL_TRIANGLE_STRIP,0,4);
	}
	for (std::list<context*>::iterator it = scene->subcontexts.begin(); it!=scene->subcontexts.end(); ++it) {
		recursiveRender(*it);
	}
	mvpStack.pop();
}
示例#2
0
文件: glaz.cpp 项目: xav9211/Grafika
//=============================================================================
// wyświetlenie sceny
//=============================================================================
void display(void)
{
	// czyszczenie bufora koloru
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
	// załadowanie macierzy jednostkowej do macierzy widoku modelu
	modelView.setIdentity();

	// użycie obiektu shadera
	glUseProgram(simplyShader);


	// kierunek źródła światła
	GLfloat lightDir[4] = {4.0f, 6.0f, 3.0f, 1.0f};

	// załadowanie do shadera wektora położenia światła (w aktualnym układzie współrzędnych)
	glUniform3fv(glGetUniformLocation(simplyShader, "inLightDir"), 1, lightDir);

	
	// załadownanie do shadera bieżącego stanu macierzy projekcji - wystarczy raz, bo jest tu niezmienna
	glUniformMatrix4fv(glGetUniformLocation(simplyShader, "projectionMatrix"), 1, GL_TRUE, projection.get());

	modelView.rotate(angWorldX, 1.0f, 0.0f, 0.0f);
	modelView.rotate(angWorldY, 0.0f, 1.0f, 0.0f);
	modelView.rotate(angWorldZ, 0.0f, 0.0f, 1.0f);
	modelView.translate(translWorld[0], translWorld[1], translWorld[2]);

	modelViewStack.put(&modelView);
	modelView.translate(transObject[0], transObject[1], transObject[2]);
	modelView.rotate(angX, 1.0f, 0.0f, 0.0f);
	modelView.rotate(angY, 0.0f, 1.0f, 0.0f);
	modelView.rotate(angZ, 0.0f, 0.0f, 1.0f);

	// załadowanie do shadera wektora koloru obiektu
	glUniform4fv(glGetUniformLocation(simplyShader, "inColor"), 1, objectColor);
	glUniformMatrix4fv(glGetUniformLocation(simplyShader, "modelViewMatrix"), 1, GL_TRUE, modelView.get());

	// narysowanie danych zawartych w tablicy
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	glDrawElements(GL_TRIANGLES, 3*6*2, GL_UNSIGNED_INT, 0);

	// włączenie tablicy wierzchołków .obj
	glBindVertexArray(objVertexArray);
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	// narysowanie danych zawartych w tablicy wierzchołków .obj
	glDrawElements(GL_TRIANGLES, 3*obj.nFaces, GL_UNSIGNED_INT, 0);

	// pobranie macierzy widoku modelu ze stosu
	modelViewStack.pop(&modelView);

	modelViewStack.put(&modelView);
	modelView.translate(0.5f, 0.0f, 0.5f);
	modelView.rotate(-2.5f, 1.0f, 0.0f, 0.0f);
	modelView.rotate(0.0f, 0.0f, 1.0f, 0.0f);
	modelView.rotate(3.0f, 0.0f, 0.0f, 1.0f);

	// włączenie tablicy wierzchołków sześcianu
	glBindVertexArray(cubeVertexArray1);
	// załadownanie do shadera bieżącego stanu macierzy widoku modelu
	glUniformMatrix4fv(glGetUniformLocation(simplyShader, "modelViewMatrix"), 1, GL_TRUE, modelView.get());
	// załadowanie do shadera wektora koloru obiektu
	glUniform4fv(glGetUniformLocation(simplyShader, "inColor"), 1, redColor);

	// narysowanie danych zawartych w tablicy
	glPolygonMode(GL_FRONT, GL_FILL);
	glDrawElements(GL_TRIANGLES, 3*6*2, GL_UNSIGNED_INT, 0);

	// pobranie macierzy widoku modelu ze stosu
	modelViewStack.pop(&modelView);

		modelViewStack.put(&modelView);
	modelView.translate(-0.5f, 0.5f, -0.5f);
	modelView.rotate(-2.5f, 1.0f, 0.0f, 0.0f);
	modelView.rotate(0.0f, 0.0f, 1.0f, 0.0f);
	modelView.rotate(3.0f, 0.0f, 0.0f, 1.0f);

	// włączenie tablicy wierzchołków sześcianu
	glBindVertexArray(cubeVertexArray2);
	// załadownanie do shadera bieżącego stanu macierzy widoku modelu
	glUniformMatrix4fv(glGetUniformLocation(simplyShader, "modelViewMatrix"), 1, GL_TRUE, modelView.get());
	// załadowanie do shadera wektora koloru obiektu
	glUniform4fv(glGetUniformLocation(simplyShader, "inColor"), 1, blueColor);

	// narysowanie danych zawartych w tablicy
	glPolygonMode(GL_FRONT, GL_FILL);
	glDrawElements(GL_TRIANGLES, 3*6*2, GL_UNSIGNED_INT, 0);

	// pobranie macierzy widoku modelu ze stosu
	modelViewStack.pop(&modelView);

		modelViewStack.put(&modelView);
	modelView.translate(-0.5f, 0.0f, 0.5f);
	modelView.rotate(-2.5f, 1.0f, 0.0f, 0.0f);
	modelView.rotate(0.0f, 0.0f, 1.0f, 0.0f);
	modelView.rotate(3.0f, 0.0f, 0.0f, 1.0f);

	// włączenie tablicy wierzchołków sześcianu
	glBindVertexArray(cubeVertexArray3);
	// załadownanie do shadera bieżącego stanu macierzy widoku modelu
	glUniformMatrix4fv(glGetUniformLocation(simplyShader, "modelViewMatrix"), 1, GL_TRUE, modelView.get());
	// załadowanie do shadera wektora koloru obiektu
	glUniform4fv(glGetUniformLocation(simplyShader, "inColor"), 1, greenColor);

	// narysowanie danych zawartych w tablicy
	glPolygonMode(GL_FRONT, GL_FILL);
	glDrawElements(GL_TRIANGLES, 3*6*2, GL_UNSIGNED_INT, 0);

	// pobranie macierzy widoku modelu ze stosu
	modelViewStack.pop(&modelView);

		modelViewStack.put(&modelView);
	modelView.translate(0.5f, 0.5f, -0.5f);
	modelView.rotate(-2.5f, 1.0f, 0.0f, 0.0f);
	modelView.rotate(0.0f, 0.0f, 1.0f, 0.0f);
	modelView.rotate(3.0f, 0.0f, 0.0f, 1.0f);

	// włączenie tablicy wierzchołków sześcianu
	glBindVertexArray(cubeVertexArray4);
	// załadownanie do shadera bieżącego stanu macierzy widoku modelu
	glUniformMatrix4fv(glGetUniformLocation(simplyShader, "modelViewMatrix"), 1, GL_TRUE, modelView.get());
	// załadowanie do shadera wektora koloru obiektu
	glUniform4fv(glGetUniformLocation(simplyShader, "inColor"), 1, yellowColor);

	// narysowanie danych zawartych w tablicy
	glPolygonMode(GL_FRONT, GL_FILL);
	glDrawElements(GL_TRIANGLES, 3*6*2, GL_UNSIGNED_INT, 0);

	// pobranie macierzy widoku modelu ze stosu
	modelViewStack.pop(&modelView);

	// wyłączenie tablic wierzhołków
	glBindVertexArray(0);

	// wyłączenie shadera
	glUseProgram(0);

	// wyrenderowanie sceny
	glFlush();

	glutSwapBuffers();
}