1. 程式人生 > >圖形學實驗六真實感圖形演算法

圖形學實驗六真實感圖形演算法

實驗六  真實感圖形演算法

實驗型別:設計型   實驗學時:2實驗要求:必修

一、實驗目的

瞭解掌握OpenGL程式的光照與材質,能正確使用光源與材質函式設定所需的繪製效果。

二、實驗內容

(1)下載並執行Nate Robin教學程式包中的lightmaterial程式,試驗不同的光照與材質係數;

(2)執行示範程式碼1,瞭解光照與材質函式使用。

三、實驗原理

為在場景中增加光照,需要執行以下步驟:

設定一個或多個光源,設定它的有關屬性;

選擇一種光照模型;

設定物體的材料屬性。

四、實驗示範程式碼(略)

五、實驗步驟

1 在Windows xp/win7操作環境下,啟動VC;

2 建立W32 Console Application 的應用工程;

3 建立源程式編輯環境,進行編輯源程式。

4 除錯執行程式,完成實驗。

六、實驗結果處理

演示結果並儲存相關檔案。

七、實驗注意事項

注意程式設計環境的配置,即在Windows環境下,OpenGL擴充套件庫相關檔案的配置,把標頭檔案“GL.H”、庫檔案“OPENGL32.LIB”和動態連結庫“OPENGL32.DLL”配置到相應的目錄下。

八、預習與思考題

預習:閱讀課本相關內容,仔細閱讀示範程式碼。

思考題:在實驗5太陽系模型的基礎上,嘗試為其增加光照與材質效果。

九、實驗報告要求

1、實驗報告中應包括相關操作步驟和程式程式碼和執行效果截圖。

2.書寫實驗報告時要結構合理,層次分明,在分析描述的時候,需要注意語言的流暢。

茶壺程式碼:

#include<GL/glut.h>
#include<stdlib.h>

void init(void)
{
	GLfloat mat_specular[]={ 1.0,1.0,1.0,1.0 };
	GLfloat mat_shininess[] = { 50.0 };
	GLfloat light_position[]= {1.0,1.0,1.0,0.0};
	GLfloat white_light[] = { 1.0,1.0,1.0,1.0};
	GLfloat Light_Model_Ambient[]={ 0.2,0.2,0.2,0.1};

	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_SMOOTH);

	glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
	glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
	
	glLightfv(GL_LIGHT0,GL_POSITION,light_position);
	glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);
	glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT,Light_Model_Ambient);
	

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);

}

void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glutSolidTeapot(0.5);
	glFlush();
}

void reshape(int w,int h)
{
	glViewport(0,0,(GLsizei)w,(GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if(w<=h)
		glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);
	else
		glOrtho(-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-10.0,10.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc,char** argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB |GLUT_DEPTH);
	glutInitWindowSize(500,500);
	glutInitWindowPosition(100,100);
	glutCreateWindow(argv[0]);
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMainLoop();
	return 0;
}



下面為待完成:第一個為實驗需要做的,其他的為拓展,根據自己能力看是否要做。

完結!