电路仿真软件proteus8仿真问题

OpenGL程序--基于Win32窗体应用程序框架
NEHE教程中是以Win32窗体应用程序为框架的,现实现它。
建立Win32 Project工程,如下图
选择Windows application,及Empty project,如下
新建一个cpp源文件,编写代码如下(摘自周炜NEHE中文教程第一课:)
注意:由于有前面日志(,见最后)提到的OpenGL环境配置,故无需引入lib库的操作。
&windows.h&&&&
// Windows的头文件
#include &gl\GL.h&
&gl\GLU.h&&&&&&&&
包含最新的gl.h,glu.h库&&&&&&&
&gl\glut.h&&&&
// 包含OpenGL实用库
HGLRC&&&&&&&&&&
hRC=NULL;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 窗口着色描述表句柄
HDC&&&&&&&&&&&&
hDC=NULL;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// OpenGL渲染描述表句柄
HWND&&&&&&&&&&&
hWnd=NULL;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 保存我们的窗口句柄
HINSTANCE&&&&&&
hI&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 保存程序的实例
keys[256];&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 保存键盘按键的数组
active=TRUE;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 窗口的活动标志,缺省为TRUE
fullscreen=TRUE;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 全屏标志缺省,缺省设定成全屏模式
LRESULT&&&
CALLBACK WndProc(HWND, UINT, WPARAM,
LPARAM);&&&&&&&&&&&
// WndProc的定义
GLvoid ReSizeGLScene(GLsizei width, GLsizei
height)&&&&&&&&&&&&&&&
// 重置OpenGL窗口大小
(height==0)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 防止被零除
height=1;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 将Height设为1
glViewport(0, 0, width,
height);&&&&&&&&&&&
// 重置当前的视口
glMatrixMode(GL_PROJECTION);&&&&&&&&&&&&&&&
// 选择投影矩阵
glLoadIdentity();&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 重置投影矩阵
设置视口的大小
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);&&&&&&&&&&&&&&&&&&&
// 选择模型观察矩阵
glLoadIdentity();&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 重置模型观察矩阵
InitGL(GLvoid)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 此处开始对OpenGL进行所有设置
glShadeModel(GL_SMOOTH);&&&&&&&&&&&&&&&&&&&
// 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f,
0.0f);&&&&&&&
// 黑色背景
glClearDepth(1.0f);&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 设置深度缓存
glEnable(GL_DEPTH_TEST);&&&&&&&&&&&&&&&&&&&
// 启用深度测试
glDepthFunc(GL_LEQUAL);&&&&&&&&&&&&&&&&&&&&&&&
// 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT,
GL_NICEST);&&&&&&&&&&&
// 告诉系统对透视进行修正
&&& return
TRUE;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 初始化 OK
DrawGLScene(GLvoid)&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 从这里开始进行所有的绘制
glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT);&&&&&&&&&&&
// 清除屏幕和深度缓存
glLoadIdentity();&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 重置当前的模型观察矩阵
&&& return
TRUE;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//& 一切 OK
KillGLWindow(GLvoid)&&&&&&&&&&&&&&&&&&&&&&&
// 正常销毁窗口
(fullscreen)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 我们处于全屏模式吗?
ChangeDisplaySettings(NULL,0);&&&&&&&&&&&
// 是的话,切换回桌面
ShowCursor(TRUE);&&&&&&&&&&&&&&&&&&&&&&&
// 显示鼠标指针
(hRC)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 我们拥有OpenGL渲染描述表吗?
(!wglMakeCurrent(NULL,NULL))&&&&&&&&&&&
// 我们能否释放DC和RC描述表?
&&&&&&&&&&&
MessageBox(NULL,"释放DC或RC失败。","关闭错误",MB_OK |
MB_ICONINFORMATION);
(!wglDeleteContext(hRC))&&&&&&&&&&&&&&&
// 我们能否删除RC?
&&&&&&&&&&&
MessageBox(NULL,"释放RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
hRC=NULL;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 将RC设为 NULL
&&& if (hDC
!ReleaseDC(hWnd,hDC))&&&&&&&&&&&
// 我们能否释放 DC?
MessageBox(NULL,"释放DC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
hDC=NULL;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 将 DC 设为 NULL
&&& if (hWnd
!DestroyWindow(hWnd))&&&&&&&&&&&
// 能否销毁窗口?
MessageBox(NULL,"释放窗口句柄失败。","关闭错误",MB_OK |
MB_ICONINFORMATION);
hWnd=NULL;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 将 hWnd 设为 NULL
(!UnregisterClass("OpenG",hInstance))&&&&&&&&&&&&&&&
// 能否注销类?
MessageBox(NULL,"不能注销窗口类。","关闭错误",MB_OK |
MB_ICONINFORMATION);
hInstance=NULL;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 将 hInstance 设为 NULL
BOOL CreateGLWindow(char* title, int width, int height, int bits,
bool fullscreenflag)
GLuint&&&&&&&
PixelF&&&&&&&&&&&&&&&&&&&
// 保存查找匹配的结果
WNDCLASS&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 窗口类结构
DWORD&&&&&&&
dwExS&&&&&&&&&&&&&&&&&&&&&&&
// 扩展窗口风格
DWORD&&&&&&&
dwS&&&&&&&&&&&&&&&&&&&&&&&
// 窗口风格
WindowR&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 取得矩形的左上角和右下角的坐标值
WindowRect.left=(long)0;&&&&&&&&&&&&&&&&&&&
// 将Left&& 设为 0
WindowRect.right=(long)&&&&&&&&&&&&&&&
// 将Right& 设为要求的宽度
WindowRect.top=(long)0;&&&&&&&&&&&&&&&&&&&&&&&
// 将Top&&& 设为
WindowRect.bottom=(long)&&&&&&&&&&&&&&&
// 将Bottom 设为要求的高度
fullscreen=&&&&&&&&&&&&&&&&&&&
// 设置全局全屏标志
hInstance&&&&&&&
GetModuleHandle(NULL);&&&
// 取得我们窗口的实例
wc.style&&&&&&&
= CS_HREDRAW | CS_VREDRAW |
CS_OWNDC;&&& //
移动时重画,并为窗口取得DC
wc.lpfnWndProc&&&
= (WNDPROC)
WndP&&&&&&&
// WndProc处理消息
wc.cbClsExtra&&&
0;&&&&&&&&&&&&&&&&&&&&&&&
// 无额外窗口数据
wc.cbWndExtra&&&
0;&&&&&&&&&&&&&&&&&&&&&&&
// 无额外窗口数据
wc.hInstance&&&
hI&&&&&&&&&&&&&&&
// 设置实例
wc.hIcon&&&&&&&
= LoadIcon(NULL,
IDI_WINLOGO);&&&
// 装入缺省图标
wc.hCursor&&&&&&&
= LoadCursor(NULL,
IDC_ARROW);&&&
// 装入鼠标指针
wc.hbrBackground=
NULL;&&&&&&&&&&&&&&&&&&&&&&&
// GL不需要背景
wc.lpszMenuName&&&
NULL;&&&&&&&&&&&&&&&&&&&&&&&
// 不需要菜单
wc.lpszClassName=
"OpenG";&&&&&&&&&&&&&&&&&&&
// 设定类名字
(!RegisterClass(&wc))&&&&&&&&&&&&&&&&&&&
// 尝试注册窗口类
MessageBox(NULL,"注册窗口失败","错误",MB_OK|MB_ICONEXCLAMATION);
FALSE;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 退出并返回FALSE
(fullscreen)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 要尝试全屏模式吗?
dmScreenS&&&&&&&&&&&&&&&
// 设备模式
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));&&&
// 确保内存清空为零
dmScreenSettings.dmSize=sizeof(dmScreenSettings);&&&&&&&
// Devmode 结构的大小
dmScreenSettings.dmPelsWidth&&&
&&&&&&&&&&&&&&&
// 所选屏幕宽度
dmScreenSettings.dmPelsHeight&&&
&&&&&&&&&&&&&&&
// 所选屏幕高度
dmScreenSettings.dmBitsPerPel&&&
&&&&&&&&&&&&&&&&&&&
// 每象素所选的色彩深度
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
// 尝试设置显示模式并返回结果。注: CDS_FULLSCREEN 移去了状态条。
(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
&&&&&&&&&&&
// 若模式失败,提供两个选项:退出或在窗口内运行。
&&&&&&&&&&&
if (MessageBox(NULL,"全屏模式在当前显卡上设置失败!\n使用窗口模式?","NeHe
G",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
&&&&&&&&&&&
&&&&&&&&&&&&&&&
fullscreen=FALSE;&&&&&&&&&&&&&&&
// 选择窗口模式(Fullscreen=FALSE)
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&&&
// 弹出一个对话框,告诉用户程序结束
&&&&&&&&&&&&&&&
MessageBox(NULL,"程序将被关闭","错误",MB_OK|MB_ICONSTOP);
&&&&&&&&&&&&&&&
FALSE;&&&&&&&&&&&&&&&&&&&
//& 退出并返回 FALSE
&&&&&&&&&&&
(fullscreen)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 仍处于全屏模式吗?
dwExStyle=WS_EX_APPWINDOW;&&&&&&&&&&&&&&&
// 扩展窗体风格
dwStyle=WS_POPUP;&&&&&&&&&&&&&&&&&&&&&&&
// 窗体风格
ShowCursor(FALSE);&&&&&&&&&&&&&&&&&&&&&&&
// 隐藏鼠标指针
dwExStyle=WS_EX_APPWINDOW |
WS_EX_WINDOWEDGE;&&&
// 扩展窗体风格
dwStyle=WS_OVERLAPPEDWINDOW;&&&&&&&&&&&&&&&&&&&
//& 窗体风格
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE,
dwExStyle);&&&&&&&
// 调整窗口达到真正要求的大小
(!(hWnd=CreateWindowEx(&&&
dwExStyle,&&&&&&&&&&&&&&&
// 扩展窗体风格
"OpenG",&&&&&&&&&&&&&&&
title,&&&&&&&&&&&&&&&&&&&
// 窗口标题
WS_CLIPSIBLINGS
// 必须的窗体风格属性
WS_CLIPCHILDREN
// 必须的窗体风格属性
dwStyle,&&&&&&&&&&&&&&&
// 选择的窗体属性
0,&&&&&&&&&&&&&&&&&&&
// 窗口位置
WindowRect.right-WindowRect.left,&&&
// 计算调整好的窗口宽度
WindowRect.bottom-WindowRect.top,&&&
// 计算调整好的窗口高度
NULL,&&&&&&&&&&&&&&&&&&&
// 无父窗口
NULL,&&&&&&&&&&&&&&&&&&&
hInstance,&&&&&&&&&&&&&&&
NULL)))&&&&&&&&&&&&&&&&&&&
// 不向WM_CREATE传递任何东东
KillGLWindow();&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 重置显示区
MessageBox(NULL,"不能创建一个窗口设备描述表","错误",MB_OK|MB_ICONEXCLAMATION);
FALSE;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 返回 FALSE
PIXELFORMATDESCRIPTOR
pfd=&&&&&&&&&&&&&&&&&&&
// /pfd 告诉窗口我们所希望的东东,即窗口使用的像素格式
sizeof(PIXELFORMATDESCRIPTOR),&&&&&&&&&&&&&&&&&&&
// 上述格式描述符的大小
1,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
PFD_DRAW_TO_WINDOW
|&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 格式支持窗口
PFD_SUPPORT_OPENGL
|&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 格式必须支持OpenGL
PFD_DOUBLEBUFFER,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 必须支持双缓冲
PFD_TYPE_RGBA,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 申请 RGBA 格式
bits,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 选定色彩深度
0, 0, 0, 0, 0,
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 忽略的色彩位
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 无Alpha缓存
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 忽略Shift Bit
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 无累加缓存
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 忽略聚集位
16,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 16位 Z-缓存 (深度缓存)
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 无蒙板缓存
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 无辅助缓存
PFD_MAIN_PLANE,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 主绘图层
0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// Reserved
0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 忽略层遮罩
(!(hDC=GetDC(hWnd)))&&&&&&&&&&&&&&&&&&&&&&&
// 取得设备描述表了么?
KillGLWindow();&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 重置显示区
MessageBox(NULL,"不能创建一种相匹配的像素格式","错误",MB_OK|MB_ICONEXCLAMATION);
FALSE;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 返回 FALSE
(!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))&&&&&&&
// Windows 找到相应的象素格式了吗?
KillGLWindow();&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 重置显示区
MessageBox(NULL,"不能设置像素格式","错误",MB_OK|MB_ICONEXCLAMATION);
FALSE;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 返回 FALSE
if(!SetPixelFormat(hDC,PixelFormat,&pfd))&&&
// 能够设置象素格式么?
KillGLWindow();&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 重置显示区
MessageBox(NULL,"不能设置像素格式","错误",MB_OK|MB_ICONEXCLAMATION);
FALSE;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 返回 FALSE
(!(hRC=wglCreateContext(hDC)))&&&&&&&&&&&
// 能否取得着色描述表?
KillGLWindow();&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 重置显示区
MessageBox(NULL,"不能创建OpenGL渲染描述表","错误",MB_OK|MB_ICONEXCLAMATION);
FALSE;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 返回 FALSE
if(!wglMakeCurrent(hDC,hRC))&&&&&&&&&&&&&&&
// 尝试激活着色描述表
KillGLWindow();&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 重置显示区
MessageBox(NULL,"不能激活当前的OpenGL渲然描述表","错误",MB_OK|MB_ICONEXCLAMATION);
FALSE;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 返回 FALSE
ShowWindow(hWnd,SW_SHOW);&&&&&&&&&&&&&&&&&&&
// 显示窗口
SetForegroundWindow(hWnd);&&&&&&&&&&&&&&&&&&&
// 略略提高优先级
SetFocus(hWnd);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 设置键盘的焦点至此窗口
ReSizeGLScene(width,
height);&&&&&&&&&&&&&&&
// 设置透视 GL 屏幕
(!InitGL())&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 初始化新建的GL窗口
KillGLWindow();&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 重置显示区
MessageBox(NULL,"Initialization
Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
FALSE;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 返回 FALSE
&&& return
TRUE;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
LRESULT CALLBACK
WndProc(&&&
hWnd,&&&&&&&
// 窗口的句柄
&&&&&&&&&&&&&&&&&&&&&&&&
uMsg,&&&&&&&&&&&
// 窗口的消息
&&&&&&&&&&&&&&&&&&&&&&&&
wParam,&&&&&&&&&&&
// 附加的消息内容
&&&&&&&&&&&&&&&&&&&&&&&&
lParam)&&&&&&&&&&&
// 附加的消息内容
&&& switch
(uMsg)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 检查Windows消息
WM_ACTIVATE:&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 监视窗口激活消息
&&&&&&&&&&&
(!HIWORD(wParam))&&&&&&&&&&&&&&&
// 检查最小化状态
&&&&&&&&&&&
&&&&&&&&&&&&&&&
active=TRUE;&&&&&&&&&&&&&&&&&&&
// 程序处于激活状态
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&&&
active=FALSE;&&&&&&&&&&&&&&&&&&&
// 程序不再激活
&&&&&&&&&&&
&&&&&&&&&&&
0;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 返回消息循环
WM_SYSCOMMAND:&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 系统中断命令
&&&&&&&&&&&
(wParam)&&&&&&&&&&&&&&&&&&&&&&&
// 检查系统调用
&&&&&&&&&&&
&&&&&&&&&&&
SC_SCREENSAVE:&&&&&&&&&&&&&&&&&&&
// 屏保要运行?
&&&&&&&&&&&
SC_MONITORPOWER:&&&&&&&&&&&&&&&
// 显示器要进入节电模式?
&&&&&&&&&&&&&&&
0;&&&&&&&&&&&&&&&&&&&&&&&
// 阻止发生
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
WM_CLOSE:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 收到Close消息?
&&&&&&&&&&&
PostQuitMessage(0);&&&&&&&&&&&&&&&&&&&
// 发出退出消息
&&&&&&&&&&&
0;&&&&&&&&&&&&&&&&&&&&&&&&&&&
WM_KEYDOWN:&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 有键按下么?
&&&&&&&&&&&
keys[wParam] =
TRUE;&&&&&&&&&&&&&&&
// 如果是,设为TRUE
&&&&&&&&&&&
0;&&&&&&&&&&&&&&&&&&&&&&&&&&&
WM_KEYUP:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 有键放开么?
&&&&&&&&&&&
keys[wParam] =
FALSE;&&&&&&&&&&&&&&&
// 如果是,设为FALSE
&&&&&&&&&&&
0;&&&&&&&&&&&&&&&&&&&&&&&&&&&
WM_SIZE:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 调整OpenGL窗口大小
&&&&&&&&&&&
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));&&&&&&&
// LoWord=Width,HiWord=Height
&&&&&&&&&&&
0;&&&&&&&&&&&&&&&&&&&&&&&&&&&
DefWindowProc传递所有未处理的消息。
&&& return
DefWindowProc(hWnd,uMsg,wParam,lParam);
int WINAPI
WinMain(&&&
HINSTANCE&&&
hInstance,&&&&&&&
// 当前窗口实例
&&&&&&&&&&&&&&&&&&
HINSTANCE&&&
hPrevInstance,&&&
// 前一个窗口实例
&&&&&&&&&&&&&&&&&&
LPSTR&&&&&&&
lpCmdLine,&&&&&&&
// 命令行参数
&&&&&&&&&&&&&&&&&&
int&&&&&&&
nCmdShow)&&&&&&&&&&&
// 窗口显示状态
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// Windowsx消息结构
done=FALSE;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 用来退出循环的Bool 变量
提示用户选择运行模式
(MessageBox(NULL,"你想在全屏模式下运行么?",
"设置全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO)
fullscreen=FALSE;&&&&&&&&&&&&&&&&&&&&&&&
// FALSE为窗口模式
创建OpenGL窗口
(!CreateGLWindow("NeHe's OpenGL程序框架",640,480,16,fullscreen))
0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 失败退出
while(!done)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 保持循环直到 done=TRUE
(PeekMessage(&msg,NULL,0,0,PM_REMOVE))&&&
// 有消息在等待吗?
&&&&&&&&&&&
(msg.message==WM_QUIT)&&&&&&&&&&&&&&&
// 收到退出消息?
&&&&&&&&&&&
&&&&&&&&&&&&&&&
done=TRUE;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 是,则done=TRUE
&&&&&&&&&&&
&&&&&&&&&&&
else&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 不是,处理窗口消息
&&&&&&&&&&&
&&&&&&&&&&&&&&&
TranslateMessage(&msg);&&&&&&&&&&&&&&&
// 翻译消息
&&&&&&&&&&&&&&&
DispatchMessage(&msg);&&&&&&&&&&&&&&&
// 发送消息
&&&&&&&&&&&
else&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 如果没有消息
&&&&&&&&&&&
// 绘制场景。监视ESC键和来自DrawGLScene()的退出消息
&&&&&&&&&&&
(active)&&&&&&&&&&&&&&&&&&&&&&&
// 程序激活的么?
&&&&&&&&&&&
&&&&&&&&&&&&&&&
(keys[VK_ESCAPE])&&&&&&&
// ESC 按下了么?
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
done=TRUE;&&&&&&&&&&&&&&&
// ESC 发出退出信号
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
else&&&&&&&&&&&&&&&&&&&&&&&
// 不是退出的时候,刷新屏幕
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
DrawGLScene();&&&&&&&&&&&&&&&
// 绘制场景
&&&&&&&&&&&&&&&&&&&
SwapBuffers(hDC);&&&&&&&&&&&
// 交换缓存 (双缓存)
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
(keys[VK_F1])&&&&&&&&&&&&&&&&&&&
// F1键按下了么?
&&&&&&&&&&&
&&&&&&&&&&&&&&&
keys[VK_F1]=FALSE;&&&&&&&&&&&&&&&
// 若是,使对应的Key数组中的值为 FALSE
&&&&&&&&&&&&&&&
KillGLWindow();&&&&&&&&&&&&&&&&&&&
// 销毁当前的窗口
&&&&&&&&&&&&&&&
fullscreen=!&&&&&&&&&&&
// 切换 全屏 / 窗口 模式
&&&&&&&&&&&&&&&
// 重建 OpenGL 窗口
&&&&&&&&&&&&&&&
if (!CreateGLWindow("NeHe's OpenGL
程序框架",640,480,16,fullscreen))
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
0;&&&&&&&&&&&&&&&&&&&
// 如果窗口未能创建,程序退出
&&&&&&&&&&&&&&&
&&&&&&&&&&&
KillGLWindow();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 销毁窗口
&&& return
(msg.wParam);&&&&&&&&&&&&&&&&&&&&&&&
// 退出程序
如果报如下错误
error C2664: 'MessageBoxW' : cannot convert parameter 2 from
'const char [25]' to 'LPCWSTR'
Types poin conversion requires
reinterpret_cast, C-style cast or function-style cast
那是因为使用了Unicode码,可以在工程设置中修改(改为Not Set)
程序运行的结果为
选择否,则
否则,全屏为黑屏。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。opengl绘制简单的图形出错_opengl吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:4,724贴子:
opengl绘制简单的图形出错收藏
#include "stdafx.h"#include "resource.h"#include &gl/gl.h&#include &gl/glu.h&#define MAX_LOADSTRING 100#pragma comment(lib,"Opengl32.lib")// Global Variables:HINSTANCE hI
// current instanceTCHAR szTitle[MAX_LOADSTRING];
// The title bar textTCHAR szWindowClass[MAX_LOADSTRING];HWND
g_hDC;HGLRC
g_hRC; bool g_shouldRun=void DrawGL();void InitGL();
// The title bar text // Foward declarations of functions included in this code module:ATOM
MyRegisterClass(HINSTANCE hInstance);BOOL
InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
lpCmdLine,
nCmdShow){
// TODO: Place code here. MSG HACCEL hAccelT // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance);
// Perform application initialization: if (!InitInstance (hInstance, nCmdShow))
return FALSE; }
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MY);
// Main message loop: while (g_shouldRun)
if(PeekMessage(&msg,g_hWnd,0,0,PM_REMOVE))
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
TranslateMessage(&msg);
DispatchMessage(&msg);
::SwapBuffers(g_hDC);
return msg.wParam ////
FUNCTION: MyRegisterClass()////
PURPOSE: Registers the window class.////
COMMENTS:////
This function and its usage is only necessary if you want this code//
to be compatible with Win32 systems prior to the 'RegisterClassEx'//
function that was added to Windows 95. It is important to call this function//
so that the application will get 'well formed' small icons associated//
with it.//ATOM MyRegisterClass(HINSTANCE hInstance){ WNDCLASSEX wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style
= CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndP wcex.cbClsExtra
= 0; wcex.cbWndExtra
= 0; wcex.hInstance
= hI wcex.hIcon
= LoadIcon(hInstance, (LPCTSTR)IDI_GLTASK); wcex.hCursor
= LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCSTR)IDC_GLTASK; wcex.lpszClassName = szWindowC wcex.hIconSm
= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex);} ////
FUNCTION: InitInstance(HANDLE, int)////
PURPOSE: Saves instance handle and creates main window////
COMMENTS:////
In this function, we save the instance handle in a global variable and
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或OpenGL学习进程(4)第二课:绘制图形 - MenAngel - 博客园
posts(155)
comments(10)
trackbacks(0)
& &&本节是OpenGL学习的第二个课时,下面介绍如何用点和线来绘制图形:
& & (1)用点的坐标来绘制矩形:
#include &GL/glut.h&
void display(void)
// clear all pixels
glClear(GL_COLOR_BUFFER_BIT);
// draw yellow polygon (rectangle) with corners at
glColor3f(1.0, 1.0, 0.0);
glBegin(GL_POLYGON);           //绘制开始前必须调用glBegin以通知绘制图形的类型,比如还可以绘制点,线等。
glVertex3f(0.20, 0.20, 0.0);
glVertex3f(0.80, 0.20, 0.0);
glVertex3f(0.80, 0.80, 0.0);
glVertex3f(0.20, 0.80, 0.0);
//结束之后则要调用glEnd函数
glFlush();
void init(void)
// select clearing color: blue
glClearColor(0.0, 1.0, 0.0, 0.0);
// initialize viewing values
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
int main(int argc, char** argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(300, 300);
glutInitWindowPosition(400, 300);
glutCreateWindow("polyon");
glutDisplayFunc(display);
glutMainLoop();
& & 代码解释:
& & 1)glClear(GLbitfield mask)
& & glClear sets the bitplane area of the window to values previously selected by glClearColor, glClearDepth, and glClearStencil. Multiple color buffers can be cleared simultaneously by selecting more than one buffer at a time using glDrawBuffer.
& & The pixel ownership test, the scissor test, dithering, and the buffer writemasks affect the operation of glClear. The scissor box bounds the cleared region. Alpha function, blend function, logical operation, stenciling, texture mapping, and depth-buffering are ignored by glClear.
& & glClear takes a single argument that is the bitwise OR of several values indicating which buffer is to be cleared.The values are as follows:
& & GL_COLOR_BUFFER_BIT Indicates the buffers currently enabled for color writing.
& & GL_DEPTH_BUFFER_BIT Indicates the depth buffer.
& & GL_STENCIL_BUFFER_BIT Indicates the stencil buffer.&
& & The value to which each buffer is cleared depends on the setting of the clear value for that buffer.
& & 2)glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
& & glClearColor specifies the red, green, blue, and alpha values used by glClear to clear the color buffers. Values specified by glClearColor are clamped to the range [0,1].
& & 3)glMatrixMode(GLenum mode)
& &&学习OpenGL时,对矩阵的操作是核心。glMatrixMode告诉我们这个当前矩阵是什么矩阵。
& & 4)glColor3f()
& & 对颜色进行设定。OpenGl绘制图形形状时,并不绘制颜色,而是在绘制形状之前指定好颜色
& & 5)glLoadIdentity()
& &&恢复初始坐标系,重置当前指定的矩阵为单位矩阵。
& & 6)glOrtho(left, right, bottom, top, near, far)
& &&glOrtho(投影变换函数)创建一个正交平行的视景体,一般用于"物体不会因为离屏幕的远近而产生大小的变换"的情况。
& &&OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho。
& & (2)演示投影变换函数对画出图形位置的影响:
& & & 1).示例1:
#include &GL/glut.h&
void display(void)
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(0.20, 0.20, 0.0);
glVertex3f(0.80, 0.20, 0.0);
glVertex3f(0.80, 0.80, 0.0);
glVertex3f(0.20, 0.80, 0.0);
glFlush();
void init(void)
glClearColor(0.0, 1.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
int main(int argc, char** argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(300, 300);
glutInitWindowPosition(400, 300);
glutCreateWindow("polyon");
glutDisplayFunc(display);
glutMainLoop();
& & & 2).示例2:
#include &GL/glut.h&
void display(void)
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(-0.80, 0.80, 0.0);
glVertex3f(-0.80, -0.80, 0.0);
glVertex3f(0.80, -0.80, 0.0);
glVertex3f(0.80, 0.80, 0.0);
glFlush();
void init(void)
glClearColor(0.0, 1.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
int main(int argc, char** argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(300, 300);
glutInitWindowPosition(400, 300);
glutCreateWindow("polyon");
glutDisplayFunc(display);
glutMainLoop();
& & & 3)结论:
& & & 代码中红色标志了他们的对应关系。
& & &&glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0)函数实际上让当前窗体显示的区域对应到一个笛卡尔坐标系xy平面的矩形上(仅2D,所以只看前4个参数),原点是窗体显示区域的中心。
& & & 在第一个例子中的点仅存在于第一象限,因此虽然窗体包含有4个坐标系,它仅仅在第一个区域显示图形。在第二个例子中,4个点存在4个象限中,因此显示的矩形横跨4个象限。
& & & 而在开始的例子中,窗体的显示区域仅仅对应了第一象限。
& & (3)详细介绍:
& & & 1).在openGL中编程,经常用到glColor3f()函数进行颜色设定,现对参数与颜色的对应关系整理如下:
glColor3f(0.0, 0.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 0.0);
glColor3f(1.0, 0.0, 1.0);
--& 品红色
glColor3f(0.0, 1.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
& & & 2).void glMatrixMode(GLenum mode)
& & &&mode告诉计算机将什么矩阵设置为当前矩阵,可选值有: GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE。
GL_MODELVIEW: 应用这个参数后,表示接下来的矩阵操作都是针对模型视景矩阵堆栈 。
直到下一次调用这个函数并更改参数为止。
GL_PROJECTION:应用这个参数后,表示接下来的矩阵操作都是针对投影矩阵堆栈
直到下一次调用这个函数并更改参数为止。
GL_TEXTURE :
应用这个参数后,表示接下来的矩阵操作都是针对纹理矩阵堆栈
直到下一次调用这个函数并更改参数为止。
& & & 由于对不同的矩阵有不同的操作,置了当前的矩阵后,我们接下来所调用的所有openGL库函数的功能必须确定是针对我们设定的这个当前矩阵的,不能张冠李戴。
glMatrixMode(GL_MODELVIEW );//设置当前矩阵为模型视景矩阵
gluPerspective(45.0f,(GLfloat)cx/(GLfloat)cy,0.1f,100.0f);//对图像进行透视投影,以将三维物体显示在二维平面上
这样调用是错误的,结果将没有图像显示。这是因为,我们设置了当前矩阵为模型视景矩阵,而gluPerspective()是要对投影矩阵进行操作,那么计算机就会把模型矩阵当做投影矩阵,来与 gluPerspective()指定的矩阵进行乘法运算,最终就会导致错误。
& & & 3).void glLoadIdentity(void)(.cn/s/blog_957b9fdb0100zez9.html)
& & &&glLoadIdentity是非常简单的恢复初始坐标系的手段,用一个4&4的单位矩阵来替换当前矩阵。
当您调用glLoadIdentity()之后,您实际上将当前点移到了屏幕中心:类似于一个复位操作
1.X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
2.OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。
3.中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。
& & &由于某些原因可能使得当前矩阵中的元素有一些不确定的值,这将导致程序对图形对象进行几何变形时得到一个非预期的结果。因此有必要将当前矩阵初始成一个单位矩阵,即对图形对象不做任何变换。这就是为什么在调用过glMatrixMode()命令后,总是要调用该命令的原因。
& & &&用单位矩阵替换当前矩阵并不改变当前矩阵模式。
& & & 4).glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)
& & &&创建一个平行视景体(就是一个长方体空间区域,也相当于对立体空间进行3D裁剪)。这种投影意味着离观察者较远的对象看上去不会变小(与透视投影相反)。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。& & &
  六个参数, 前两个是x轴最小坐标和最大坐标,中间两个是y轴,最后两个是z轴值。其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(right,top,-near);远裁剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。
  注意,所有的near和far值同时为正或同时为负, 值不能相同。如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。只有在视景体里的物体才能显示出来。如果最后两个值是(0,0),也就是near和far值相同了,视景体深度没有了,整个视景体都被压成个平面了,就会显示不正确。
& & & 5).glBegin()和glEnd()
& & &绘制图像的开始或结束的标志。
& & & 它们之间可以执行的函数:
glVertex*()
设置顶点坐标
glColor*()
设置当前颜色
glIndex*()
设置当前颜色表
glNormal*()
设置法向坐标
glCoord*()
glCallList(),glCallLists()
执行显示列表
glTexCoord*()
设置纹理坐标
glEdgeFlag*()
控制边界绘制
glMaterial*()
& & & 可以绘制的图形的类型:
单个顶点集
多组双顶点线段
GL_POLYGON
单个简单填充凸多边形
GL_TRAINGLES
多组独立填充三角形
多组独立填充四边形
GL_LINE_STRIP
不闭合折线
GL_LINE_LOOP
GL_TRAINGLE_STRIP 线型连续填充三角形串
GL_TRAINGLE_FAN
扇形连续填充三角形串
GL_QUAD_STRIP
连续填充四边形串
& & & 6)3D编程的基础知识:
渲染:对一个三维物体进行几何描述,并且把它转换为屏幕上的一幅图像,这个过程就叫渲染。
纹理贴图:通过一副图像向一个多边形提供额外细节的技巧称为纹理贴图。我们所提供的图像称为纹理,纹理中每个单独的元素称为纹理单元(或纹理像素,texel)。
过滤(filtering):在一个物体的表面上拉伸或压缩纹理单元(纹理像素)的过程称为过滤。
混合(blending):指屏幕上颜色或物体的组合。混合可以用于多种目的,如制作透明效果、反射效果等。
裁剪区域:窗口(即屏幕)是以像素为单位进行度量的。裁剪区域指的是占据窗口的笛卡尔坐标空间中的区域。也可以解释为填充窗口的笛卡尔坐标空间中的区域。注意,裁剪区域使用的是笛卡尔坐标系统。
视口:因为裁剪区域的宽度和高度很少正好与窗口的宽度和高度(以像素为单位)相匹配,所以需要把坐标系统从逻辑笛卡尔坐标空间映射到物理屏幕像素坐标空间。视口就是窗口中用于绘制裁剪区域的客户区域。这里,要注意窗口与视口的区别,视口在窗口中指定,我们可以使用视口来缩小或者放大窗口中的图像。//类似4所说的东西
管线:它用于描述一种过程,该过程可能涉及两个或更多个独特的阶段或步骤。
OpenGL命令缓冲区:当应用程序进行OpenGL API函数调用时,这些命令被放置在一个命令缓冲区中。最终,这个缓冲区中会填满API 调用命令、顶点数据、纹理数据之类的东西。当缓冲区被刷新时,命令和数据就会被传递给管线的下一个阶段。
变换和光照(T&L):这是一个数学计算密集型的阶段。在变换阶段,描述物体几何形状的顶点被重新计算(经历多次不同坐标空间的变换),以确定这个物体的位置和朝向。同时进行的光照计算阶段(世界坐标空间中)将确定每个顶点该具有的颜色和亮度。
10、 光栅化:该阶段根据几何图形、颜色和纹理数据实际创建彩色图像。然后,图像被放入到帧缓冲区之中。
11、 帧缓冲区:即图形显示设备的内存。图像放入到帧缓冲区意味着将会在屏幕上显示(刷新帧缓冲区时)。
& & (4)绘制不同图形的实例:
#include &GL/glut.h&
#include &math.h&
const int n = 1000;
const GLfloat R = 0.40f;
const GLfloat Pi = 3.f;
const GLfloat factor = 0.1f;
void paint(void)
//在下半部分画一个正弦图像,上半部分画一个圆和一个五角形
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);//红色的圆
glBegin(GL_POLYGON);//有顶点就必须要有glBegin() glEnd();
for(i=0; i&n; ++i)
glVertex2f(R*cos(2*Pi/n*i)-0.50f, R*sin(2*Pi/n*i)+0.5f);//将圆形的中点向左上方平移
glFlush();
//2.五角形
glColor3f(0.0f,0.0f,0.0f);//黑色的五角形
GLfloat a = 1/ (4 - 4 * cos(72 * Pi / 180));
GLfloat bx = a * cos(18 * Pi / 180);
GLfloat by = a * sin(18 * Pi / 180);
GLfloat cy = -a * cos(18 * Pi / 180);
PointA[2] = { 0+0.50, a+0.50 },
PointB[2] = { bx+0.5, by+0.50 },
PointC[2] = { 0.25+0.50, cy+0.50 },
PointD[2] = { -0.25+0.50, cy+0.50 },
PointE[2] = { -bx+0.50, by+0.50 };
//将整体向右上方平移
// 按照A-&C-&E-&B-&D-&A的顺序,将五角星画出
glBegin(GL_LINE_LOOP);//闭合折线
glVertex2fv(PointA);
glVertex2fv(PointC);
glVertex2fv(PointE);
glVertex2fv(PointB);
glVertex2fv(PointD);
glFlush();
//3.正弦图像:
//黑色的正弦图像
glBegin(GL_LINE_STRIP);
for(x=-1.0f/ x&1.0f/ x+=0.01f)
glVertex2f(x*factor, sin(x)*factor-0.50);
glFlush();
//4.分割线:
glColor3f(0.5f,0.5f,0.0f);//黄色的分割线
glBegin(GL_LINES);
glVertex2f(-1.0f, 0.0f);
glVertex2f(1.0f, 0.0f);
// 以上两个点可以画x轴
glVertex2f(0.0f, 0.0f);
glVertex2f(0.0f, 1.0f);
// 以上两个点可以画y轴
glFlush();
void init(void)
glClearColor(0.0,1.0,1.0,0.0);//设背景为青色
glMatrixMode(GL_PROJECTION);//创建投影矩阵堆栈
glLoadIdentity();//将当前矩阵设为单位矩阵,恢复初始坐标系
gluOrtho2D(-1.0f,1.0f,-1.0f,1.0f);//窗口左上角坐标(-1,1),右下角坐标(1,-1);
int main(int argc,char *argv[])
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(600,600);
glutInitWindowPosition(300, 100);
glutCreateWindow("圆形五角形和正弦图像");
glutDisplayFunc(paint);
glutMainLoop();

我要回帖

更多关于 proteus7.8 仿真教程 的文章

 

随机推荐