给图形着色.docx

上传人:b****6 文档编号:8113220 上传时间:2023-01-28 格式:DOCX 页数:14 大小:21.28KB
下载 相关 举报
给图形着色.docx_第1页
第1页 / 共14页
给图形着色.docx_第2页
第2页 / 共14页
给图形着色.docx_第3页
第3页 / 共14页
给图形着色.docx_第4页
第4页 / 共14页
给图形着色.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

给图形着色.docx

《给图形着色.docx》由会员分享,可在线阅读,更多相关《给图形着色.docx(14页珍藏版)》请在冰豆网上搜索。

给图形着色.docx

给图形着色

给图形着色

一、实验目的及要求

1)掌握OPENGL中一些常用函数

2)掌握两种不同的着色方法:

Flatcoloring(单调着色),Smoothcoloring(平滑着色)

二、实验内容

1)创建Project,完成一个三角形的平滑着色和一个正方形的单调着色的显示算法

2)运行程序,观察结果,体会两者的区别,给出显示结果

三、实验的核心算法(C参考程序)及实验结果

1、图形着色的部分核心代码如下:

#include"StdAfx.h"//HeaderFileForWindows

#include//HeaderFileForStandardInput/Output

#include//HeaderFileForTheMathLibrary

#include//HeaderFileForTheOpenGL32Library

#include//HeaderFileForTheGLu32Library

#include//HeaderFileForTheGlauxLibrary

#pragmacomment(lib,"GLAUX.LIB")

#pragmacomment(lib,"GLU32.LIB")

#pragmacomment(lib,"OPENGL32.LIB")

HDChDC=NULL;//PrivateGDIDeviceContext

HGLRChRC=NULL;//PermanentRenderingContext

HWNDhWnd=NULL;//HoldsOurWindowHandle

HINSTANCEhInstance;//HoldsTheInstanceOfTheApplication

boolkeys[256];//ArrayUsedForTheKeyboardRoutine

boolactive=TRUE;//WindowActiveFlagSetToTRUEByDefault

boolfullscreen=TRUE;//FullscreenFlagSetToFullscreenModeByDefault

floatpoints[45][45][3];//TheArrayForThePointsOnTheGridOfOur"Wave"

intwiggle_count=0;//CounterUsedToControlHowFastFlagWaves

GLfloatxrot;//XRotation(NEW)

GLfloatyrot;//YRotation(NEW)

GLfloatzrot;//ZRotation(NEW)

GLfloathold;//TemporarilyHoldsAFloatingPointValue

GLuinttexture[1];//StorageForOneTexture(NEW)

LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//DeclarationForWndProc

GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight)//ResizeAndInitializeTheGLWindow

{

if(height==0)//PreventADivideByZeroBy

{

height=1;//MakingHeightEqualOne

}

glViewport(0,0,width,height);//ResetTheCurrentViewport

glMatrixMode(GL_PROJECTION);//SelectTheProjectionMatrix

glLoadIdentity();//ResetTheProjectionMatrix

//CalculateTheAspectRatioOfTheWindow

gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);//SelectTheModelviewMatrix

glLoadIdentity();//ResetTheModelviewMatrix

}

intInitGL(GLvoid)//AllSetupForOpenGLGoesHere

{

glShadeModel(GL_SMOOTH);//启用阴影平滑

glClearDepth(1.0f);//设置深度缓存

glEnable(GL_DEPTH_TEST);//启用深度测试

glDepthFunc(GL_LEQUAL);//所作深度测试的类型

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//真正精细的透视修正

returnTRUE;//InitializationWentOK

}

intDrawGLScene(GLvoid)//此过程中包括所有的绘制代码

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除屏幕及深度缓存

glLoadIdentity();//重置模型观察矩阵

glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5单位,并移入屏幕6.0

glBegin(GL_TRIANGLES);//绘制三角形

glColor3f(1.0f,0.0f,0.0f);//设置当前色为红色

glVertex3f(0.0f,1.0f,0.0f);//上顶点

glColor3f(0.0f,1.0f,0.0f);//设置当前色为绿色

glVertex3f(-1.0f,-1.0f,0.0f);//左下

glColor3f(0.0f,0.0f,1.0f);//设置当前色为蓝色

glVertex3f(1.0f,-1.0f,0.0f);//右下

glEnd();//三角形绘制结束

glTranslatef(3.0f,0.0f,0.0f);//右移3单位

glColor3f(0.5f,0.5f,1.0f);//一次性将当前色设置为蓝色

glBegin(GL_QUADS);//绘制正方形

glVertex3f(-1.0f,1.0f,0.0f);//左上

glVertex3f(1.0f,1.0f,0.0f);//右上

glVertex3f(1.0f,-1.0f,0.0f);//左下

glVertex3f(-1.0f,-1.0f,0.0f);//右下

glEnd();//正方形绘制结束

returnTRUE;//继续运行

}

GLvoidKillGLWindow(GLvoid)//ProperlyKillTheWindow

{

if(fullscreen)//AreWeInFullscreenMode?

{

ChangeDisplaySettings(NULL,0);//IfSoSwitchBackToTheDesktop

ShowCursor(TRUE);//ShowMousePointer

}

if(hRC)//DoWeHaveARenderingContext?

{

if(!

wglMakeCurrent(NULL,NULL))//AreWeAbleToReleaseTheDCAndRCContexts?

{

MessageBox(NULL,"ReleaseOfDCAndRCFailed.","SHUTDOWNERROR",MB_OK|MB_ICONINFORMATION);

}

if(!

wglDeleteContext(hRC))//AreWeAbleToDeleteTheRC?

{

MessageBox(NULL,"ReleaseRenderingContextFailed.","SHUTDOWNERROR",MB_OK|MB_ICONINFORMATION);

}

hRC=NULL;//SetRCToNULL

}

if(hDC&&!

ReleaseDC(hWnd,hDC))//AreWeAbleToReleaseTheDC

{

MessageBox(NULL,"ReleaseDeviceContextFailed.","SHUTDOWNERROR",MB_OK|MB_ICONINFORMATION);

hDC=NULL;//SetDCToNULL

}

if(hWnd&&!

DestroyWindow(hWnd))//AreWeAbleToDestroyTheWindow?

{

MessageBox(NULL,"CouldNotReleasehWnd.","SHUTDOWNERROR",MB_OK|MB_ICONINFORMATION);

hWnd=NULL;//SethWndToNULL

}

if(!

UnregisterClass("OpenGL",hInstance))//AreWeAbleToUnregisterClass

{

MessageBox(NULL,"CouldNotUnregisterClass.","SHUTDOWNERROR",MB_OK|MB_ICONINFORMATION);

hInstance=NULL;//SethInstanceToNULL

}

}

/*ThisCodeCreatesOurOpenGLWindow.ParametersAre:

*

*title-TitleToAppearAtTheTopOfTheWindow*

*width-WidthOfTheGLWindowOrFullscreenMode*

*height-HeightOfTheGLWindowOrFullscreenMode*

*bits-NumberOfBitsToUseForColor(8/16/24/32)*

*fullscreenflag-UseFullscreenMode(TRUE)OrWindowedMode(FALSE)*/

BOOLCreateGLWindow(char*title,intwidth,intheight,intbits,boolfullscreenflag)

{

GLuintPixelFormat;//HoldsTheResultsAfterSearchingForAMatch

WNDCLASSwc;//WindowsClassStructure

DWORDdwExStyle;//WindowExtendedStyle

DWORDdwStyle;//WindowStyle

RECTWindowRect;//GrabsRectangleUpperLeft/LowerRightValues

WindowRect.left=(long)0;//SetLeftValueTo0

WindowRect.right=(long)width;//SetRightValueToRequestedWidth

WindowRect.top=(long)0;//SetTopValueTo0

WindowRect.bottom=(long)height;//SetBottomValueToRequestedHeight

fullscreen=fullscreenflag;//SetTheGlobalFullscreenFlag

hInstance=GetModuleHandle(NULL);//GrabAnInstanceForOurWindow

wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;//RedrawOnSize,AndOwnDCForWindow.

wc.lpfnWndProc=(WNDPROC)WndProc;//WndProcHandlesMessages

wc.cbClsExtra=0;//NoExtraWindowData

wc.cbWndExtra=0;//NoExtraWindowData

wc.hInstance=hInstance;//SetTheInstance

wc.hIcon=LoadIcon(NULL,IDI_WINLOGO);//LoadTheDefaultIcon

wc.hCursor=LoadCursor(NULL,IDC_ARROW);//LoadTheArrowPointer

wc.hbrBackground=NULL;//NoBackgroundRequiredForGL

wc.lpszMenuName=NULL;//WeDon'tWantAMenu

wc.lpszClassName="OpenGL";//SetTheClassName

if(!

RegisterClass(&wc))//AttemptToRegisterTheWindowClass

{

MessageBox(NULL,"FailedToRegisterTheWindowClass.","ERROR",MB_OK|MB_ICONEXCLAMATION);

returnFALSE;//ReturnFALSE

}

if(fullscreen)//AttemptFullscreenMode?

{

DEVMODEdmScreenSettings;//DeviceMode

memset(&dmScreenSettings,0,sizeof(dmScreenSettings));//MakesSureMemory'sCleared

dmScreenSettings.dmSize=sizeof(dmScreenSettings);//SizeOfTheDevmodeStructure

dmScreenSettings.dmPelsWidth=width;//SelectedScreenWidth

dmScreenSettings.dmPelsHeight=height;//SelectedScreenHeight

dmScreenSettings.dmBitsPerPel=bits;//SelectedBitsPerPixel

dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

//TryToSetSelectedModeAndGetResults.NOTE:

CDS_FULLSCREENGetsRidOfStartBar.

if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!

=DISP_CHANGE_SUCCESSFUL)

{

//IfTheModeFails,OfferTwoOptions.QuitOrUseWindowedMode.

if(MessageBox(NULL,"TheRequestedFullscreenModeIsNotSupportedBy\nYourVideoCard.UseWindowedModeInstead?

","NeHeGL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)

{

fullscreen=FALSE;//WindowedModeSelected.Fullscreen=FALSE

}

else

{

//PopUpAMessageBoxLettingUserKnowTheProgramIsClosing.

MessageBox(NULL,"ProgramWillNowClose.","ERROR",MB_OK|MB_ICONSTOP);

returnFALSE;//ReturnFALSE

}

}

}

if(fullscreen)//AreWeStillInFullscreenMode?

{

dwExStyle=WS_EX_APPWINDOW;//WindowExtendedStyle

dwStyle=WS_POPUP;//WindowsStyle

ShowCursor(FALSE);//HideMousePointer

}

else

{

dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;//WindowExtendedStyle

dwStyle=WS_OVERLAPPEDWINDOW;//WindowsStyle

}

AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle);//AdjustWindowToTrueRequestedSize

//CreateTheWindow

if(!

(hWnd=CreateWindowEx(dwExStyle,//ExtendedStyleForTheWindow

"OpenGL",//ClassName

title,//WindowTitle

dwStyle|//DefinedWindowStyle

WS_CLIPSIBLINGS|//RequiredWindowStyle

WS_CLIPCHILDREN,//RequiredWindowStyle

0,0,//WindowPosition

WindowRect.right-WindowRect.left,//CalculateWindowWidth

WindowRect.bottom-WindowRect.top,//CalculateWindowHeight

NULL,//NoParentWindow

NULL,//NoMenu

hInstance,//Instance

NULL)))//DontPassAnythingToWM_CREATE

{

KillGLWindow();//ResetTheDisplay

MessageBox(NULL,"WindowCreationError.","ERROR",MB_OK|MB_ICONEXCLAMATION);

returnFALSE;//ReturnFALSE

}

staticPIXELFORMATDESCRIPTORpfd=//pfdTellsWindowsHowWeWantThingsToBe

{

sizeof(PIXELFORMATDESCRIPTOR),//SizeOfThisPixelFormatDescriptor

1,//VersionNumber

PFD_DRAW_TO_WINDOW|//FormatMustSupportWindow

PFD_SUPPORT_OPENGL|//FormatMustSupportOpenGL

PFD_DOUBLEBUFFER,//MustSupportDoubleBuffering

PFD_TYPE_RGBA,//RequestAnRGBAFormat

bits,//SelectOurColorDepth

0,0,0,0,0,0,//ColorBitsIgnored

0,//NoAlphaBu

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1