《计算机图形学》课内实验报告实验一.docx
- 文档编号:6121153
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:17
- 大小:91.71KB
《计算机图形学》课内实验报告实验一.docx
《《计算机图形学》课内实验报告实验一.docx》由会员分享,可在线阅读,更多相关《《计算机图形学》课内实验报告实验一.docx(17页珍藏版)》请在冰豆网上搜索。
《计算机图形学》课内实验报告实验一
一、实验题目1
二、实验目的1
三、实验内容1
四、实验结果1
五、实验体会或遇到问题2
一、实验题目
VC++结合OpenGL的程序设计方法
二、实验目的
1.认识VC++6.0下MFC的基本实现方法;
2.掌握OpenGL的安装,使用与基本操作。
三、实验内容
1.安装并使用VC++6.0
安装VC++6.0后并启动VC++6.0,然后新建工程,并重命名,生成可执行文件或MFC完成就可编写代码。
2.OpenGL的安装
OpenGL开放图形库,是一个三维计算机图形和模型库,是美国SGI公司为图形工作站开发的一种功能强大的三维图形开发包,在高级图形动画设计中表现十分突出,其安装要以VC++6.0或Java等编程语言为基础,在VC库文件中添加OpenGL专用库gl.lib,glut.lib,glaux.lib等,在头文件中添加gl.h,glut.h,glaux.h,并在系统目录(system32目录)下添加glut.dll,到glut32.dll,opengl32.dll等。
这样外部环境已完成,在编写程序时再连结相应的库就可以正常使用VC++6.0结合OpenGL编写图形程序。
3.通过演示程序了解OpenGL的强大功能,同时了解编程方法。
四、实验结果
1、建立一个工程(工程名称:
firstprogram)并及一个文件(文件名:
helloworld.cpp)。
编写一个输出“helloworld”的程序,编译运行。
生成可执行文件
2、
(1)将glut.h等所有头文件加入VC的相应文件夹中,即放入如下文件夹:
C:
\ProgramFiles\MicrosoftVisualStudio\VC98\Include\GL
将glut.dll等dll文件放到C:
\WINDOWS\system32
将opengl32.lib等文件放到VC的的相应文件夹中,即放入如下文件夹:
C:
\ProgramFiles\MicrosoftVisualStudio\VC98\Lib
建立Win32的Console工程,在工程的设置中连接所有可能用到的静态库:
opengl32.lib,glu32.lib;glaux.lib;glut32.lib;glut.lib。
实验源代码:
//HighLevelShaders.c
//OpenGLSuperBible,Chapter21
//Demonstrateshigh-levelshaders
//ProgrambyBenjaminLipchak
#include"../../Common/OpenGLSB.h"//SystemandOpenGLStuff
#include"../../Common/GLTools.h"//SystemandOpenGLStuff
#include
PFNGLDELETEOBJECTARBPROCglDeleteObjectARB;
PFNGLGETHANDLEARBPROCglGetHandleARB;
PFNGLDETACHOBJECTARBPROCglDetachObjectARB;
PFNGLCREATESHADEROBJECTARBPROCglCreateShaderObjectARB;
PFNGLSHADERSOURCEARBPROCglShaderSourceARB;
PFNGLCOMPILESHADERARBPROCglCompileShaderARB;
PFNGLCREATEPROGRAMOBJECTARBPROCglCreateProgramObjectARB;
PFNGLATTACHOBJECTARBPROCglAttachObjectARB;
PFNGLLINKPROGRAMARBPROCglLinkProgramARB;
PFNGLVALIDATEPROGRAMARBPROCglValidateProgramARB;
PFNGLUSEPROGRAMOBJECTARBPROCglUseProgramObjectARB;
PFNGLGETOBJECTPARAMETERIVARBPROCglGetObjectParameterivARB;
PFNGLGETINFOLOGARBPROCglGetInfoLogARB;
PFNGLUNIFORM1FARBPROCglUniform1fARB;
PFNGLGETUNIFORMLOCATIONARBPROCglGetUniformLocationARB;
#ifndef__APPLE__
PFNGLSECONDARYCOLOR3FPROCglSecondaryColor3f;
#endif
GLbooleanuseVertexShader=GL_TRUE;
GLbooleanuseFragmentShader=GL_TRUE;
GLbooleandoBlink=GL_FALSE;
GLbooleanneedsValidation=GL_TRUE;
GLhandleARBvShader,fShader,progObj;
GLintflickerLocation=-1;
GLintwindowWidth=512;//windowsize
GLintwindowHeight=512;
GLfloatcameraPos[]={100.0f,150.0f,200.0f,1.0f};
#defineMAX_INFO_LOG_SIZE2048
voidLink(GLbooleanfirstTime)
{
GLintsuccess;
glLinkProgramARB(progObj);
glGetObjectParameterivARB(progObj,GL_OBJECT_LINK_STATUS_ARB,&success);
if(!
success)
{
GLbyteinfoLog[MAX_INFO_LOG_SIZE];
glGetInfoLogARB(progObj,MAX_INFO_LOG_SIZE,NULL,infoLog);
fprintf(stderr,"Errorinprogramlinkage!
\n");
fprintf(stderr,"Infolog:
%s\n",infoLog);
Sleep(10000);
exit(0);
}
if(firstTime)
glUseProgramObjectARB(progObj);
//Findoutwheretheflickerconstantlives
flickerLocation=glGetUniformLocationARB(progObj,"flickerFactor");
//Initiallysettheblinkparameterto1(noflicker)
if(flickerLocation!
=-1)
glUniform1fARB(flickerLocation,1.0f);
//Programobjecthaschanged,soweshouldrevalidate
needsValidation=GL_TRUE;
}
voidRelink()
{
Link(GL_FALSE);
}
//Calledtodrawsceneobjects
voidDrawModels(void)
{
//Drawplanethattheobjectsreston
glColor3f(0.0f,0.0f,0.90f);//Blue
glNormal3f(0.0f,1.0f,0.0f);
glBegin(GL_QUADS);
glVertex3f(-100.0f,-25.0f,-100.0f);
glVertex3f(-100.0f,-25.0f,100.0f);
glVertex3f(100.0f,-25.0f,100.0f);
glVertex3f(100.0f,-25.0f,-100.0f);
glEnd();
//Drawredcube
glColor3f(1.0f,0.0f,0.0f);
glutSolidCube(48.0f);
//Drawgreensphere
glColor3f(0.0f,1.0f,0.0f);
glPushMatrix();
glTranslatef(-60.0f,0.0f,0.0f);
glutSolidSphere(25.0f,50,50);
glPopMatrix();
//Drawyellowcone
glColor3f(1.0f,1.0f,0.0f);
glPushMatrix();
glRotatef(-90.0f,1.0f,0.0f,0.0f);
glTranslatef(60.0f,0.0f,-24.0f);
glutSolidCone(25.0f,50.0f,50,50);
glPopMatrix();
//Drawmagentatorus
glColor3f(1.0f,0.0f,1.0f);
glPushMatrix();
glTranslatef(0.0f,0.0f,60.0f);
glutSolidTorus(8.0f,16.0f,50,50);
glPopMatrix();
//Drawcyanoctahedron
glColor3f(0.0f,1.0f,1.0f);
glPushMatrix();
glTranslatef(0.0f,0.0f,-60.0f);
glScalef(25.0f,25.0f,25.0f);
glutSolidOctahedron();
glPopMatrix();
}
//Calledtodrawscene
voidRenderScene(void)
{
staticGLfloatflickerFactor=1.0f;
//Trackcameraangle
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,1.0f,1.0f,1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(cameraPos[0],cameraPos[1],cameraPos[2],
0.0f,0.0f,0.0f,0.0f,1.0f,0.0f);
glViewport(0,0,windowWidth,windowHeight);
//Clearthewindowwithcurrentclearingcolor
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
if(doBlink&&(flickerLocation!
=-1))
{
//Pickarandomflickerfactor
flickerFactor+=((((GLfloat)rand())/((GLfloat)RAND_MAX))-0.5f)*0.1f;
if(flickerFactor>1.0f)flickerFactor=1.0f;
if(flickerFactor<0.0f)flickerFactor=0.0f;
glUniform1fARB(flickerLocation,flickerFactor);
}
//Validateourshaderbeforefirstuse
if(needsValidation)
{
GLintsuccess;
glValidateProgramARB(progObj);
glGetObjectParameterivARB(progObj,GL_OBJECT_VALIDATE_STATUS_ARB,&success);
if(!
success)
{
GLbyteinfoLog[MAX_INFO_LOG_SIZE];
glGetInfoLogARB(progObj,MAX_INFO_LOG_SIZE,NULL,infoLog);
fprintf(stderr,"Errorinprogramvalidation!
\n");
fprintf(stderr,"Infolog:
%s\n",infoLog);
Sleep(10000);
exit(0);
}
needsValidation=GL_FALSE;
}
//Drawobjectsinthescene
DrawModels();
if(glGetError()!
=GL_NO_ERROR)
fprintf(stderr,"GLError!
\n");
//Flushdrawingcommands
glutSwapBuffers();
if(doBlink&&(flickerLocation!
=-1))
glutPostRedisplay();
}
//Thisfunctiondoesanyneededinitializationontherendering
//context.
voidSetupRC()
{
GLintsuccess;
constGLubyte*version;
GLcharARB*vsStringPtr[1];
GLcharARB*fsStringPtr[1];
GLcharARBvsString[]=
"voidmain(void)\n"
"{\n"
"//ThisisourHelloWorldvertexshader\n"
"//noticehowcommentsareprecededby'//'\n"
"\n"
"//normalMVPtransform\n"
"vec4clipCoord=gl_ModelViewProjectionMatrix*gl_Vertex;\n"
"gl_Position=clipCoord;\n"
"\n"
"//Copytheprimarycolor\n"
"gl_FrontColor=gl_Color;\n"
"\n"
"//CalculateNDC\n"
"vec4ndc=vec4(clipCoord.xyz,0)/clipCoord.w;\n"
"\n"
"//Mapfrom[-1,1]to[0,1]beforeoutputting\n"
"gl_FrontSecondaryColor=(ndc*0.5)+0.5;\n"
"}\n";
GLcharARBfsString[]=
"uniformfloatflickerFactor;\n"
"\n"
"voidmain(void)\n"
"{\n"
"//Mixprimaryandsecondarycolors,50/50\n"
"vec4temp=mix(gl_Color,vec4(vec3(gl_SecondaryColor),1.0),0.5);\n"
"\n"
"//Multiplybyflickerfactor\n"
"gl_FragColor=temp*flickerFactor;\n"
"}\n";
fprintf(stdout,"High-levelShadersDemo\n\n");
//Makesurerequiredfunctionalityisavailable!
if(!
gltIsExtSupported("GL_ARB_vertex_shader")||
!
gltIsExtSupported("GL_ARB_fragment_shader")||
!
gltIsExtSupported("GL_ARB_shader_objects")||
!
gltIsExtSupported("GL_ARB_shading_language_100"))
{
fprintf(stderr,"GLSLextensionsnotavailable!
\n");
Sleep(2000);
exit(0);
}
version=glGetString(GL_VERSION);
if(((version[0]!
='1')||(version[1]!
='.')||
(version[2]<'4')||(version[2]>'9'))&&//1.4+
(!
gltIsExtSupported("GL_EXT_secondary_color")))
{
fprintf(stderr,"NeitherOpenGL1.4norGL_EXT_secondary_color"
"extensionisavailable!
\n");
Sleep(2000);
exit(0);
}
glCreateShaderObjectARB=gltGetExtensionPointer("glCreateShaderObjectARB");
glCreateProgramObjectARB=gltGetExtensionPointer("glCreateProgramObjectARB");
glAttachObjectARB=gltGetExtensionPointer("glAttachObjectARB");
glDetachObjectARB=gltGetExtensionPointer("glDetachObjectARB");
glDeleteObjectARB=gltGetExtensionPointer("glDeleteObjectARB");
glShaderSourceARB=gltGetExtensionPointer("glShaderSourceARB");
glCompileShaderARB=gltGetExtensionPointer("glCompileShaderARB");
glLinkProgramARB=gltGetExtensionPointer("glLinkProgramARB");
glValidateProgramARB=gltGetExtensionPointer("glValidateProgramARB");
glUseProgramObjectARB=gltGetExtensionPointer("glUseProgramObjectARB");
glGetObjectParameterivARB=gltGetExtensionPointer("glGetObjectParameterivARB");
glGetInfoLogARB=gltGetExtensionPointer("glGetInfoLogARB");
glUniform1fARB=gltGetExtensionPointer("glUniform1fARB");
glGetUniformLocationARB=gltGetExtensionPointer("glGetUniformLocationARB");
#ifndef__APPLE__
if(gltIsExtSupported("GL_EXT_secondary_color"))
glSecondaryColor3f=gltGetExtensionPointer("glSecondaryColor3fEXT");
else
glSecondaryColor3f=gltGetExtensionPointer("glSecondaryColor3f");
#endif
if(!
glCreateShaderObjectARB||!
glCreateProgramObjectARB||
!
glAttachObjectARB||!
glDetachObjectARB||!
glDeleteObjectARB||
!
glShaderSourceARB||!
glCompileShaderARB||!
glLinkProgramARB||
!
glValidateProgramARB||!
glUseProgramObjectARB||
!
glGetObjectParameterivARB||!
glGetInfoLogARB||
!
glUniform1fARB||!
glGetUniformLocationARB||
!
glSecondaryColor3f)
{
fprintf(stderr,"Notallentrypointswereavailable!
\n");
Sleep(2000);
exit(0);
}
fprintf(stdout,"Controls:
\n");
fprintf(stdout,"\tRight-clickformenu\n\n");
fprintf(stdout,"\tx/X\t\tMove+/-inxdirection\n");
fprintf(stdout,"\ty/Y\t\tMove+/-inydirection\n");
fprintf(stdout,"\tz/Z\t\tMove+/-inzdirection\n\n");
fprintf(stdout,"\tq\t\tExitdemo\n\n");
//Blackbackground
glClearColor(0.0f,0.0f,0.0f,1.0f);
glSecondaryColor3f(1.0f,1.0f,1.0f);
//Hiddensurfaceremoval
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glShadeModel(GL_SMOOTH);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机图形学 计算机 图形学 实验 报告