OPENGL三维图形绘制讨论

OpenGL(三)三维图形绘制 #include "stdafx.h" #include<GL/freeglut.h> #include<GLFW/glfw3.h> // 绘图棱锥 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 三维图形三维空间中的三角形拼接而成 glBegin(... 阅读详情
导读:
  ----科学计算可视化,计算机动画和虚拟现实是现在计算机图形学的三个热点。而这三个热点的核心都是三维真实感图形的绘制。由于OpenGL(Open GraphicsLibrary)具有跨平台性、简便、高效、功能完善,目前已经成为了三维图形制作方法中事实上的工业标准。自从WindowsNT3.51在微机平台上支持OpenGL以后,现在微软公司在Windows95OSR2、WindowsNT4.0中连续性的提供OpenGL开发环境。VisualC++从4.2 版本以后已经完全支持OpenGL API,使三维世界的"平民化"已成为必然。
  ----Windows操作系统对OpenGL的支持
  ----具有Windows编程经验的人都知道,在Windows下用GDI作图必须通过设备上下文(DeviceContext简写DC)调用相应的函数;用OpenGL作图也是类似,OpenGL函数是通过"渲染上下文"(RenderingContext简写RC)完成三维图形的绘制。Windows下的窗口和设备上下文支持"位图格式"(PIXELFORMAT)属性,和RC有着位图结构上的一致。只要在创建RC时与一个DC建立联系(RC也只能通过已经建立了位图格式的DC来创建),OpenGL的函数就可以通过RC对应的DC画到相应的显示设备上。这里还有以下需要注意的方面:
  ----1.一个线程只能拥有一个渲染上下文(RC),也就是说,用户如果在一个线程内对不同设备作图,只能通过更换与RC对应的DC来完成,而RC在线程中保持不变。(当然,删除旧的RC后再创建新的是可以的)与此对应,一个RC也只能属于一个线程,不能被不同线程同时共享。
  ----2.设定DC位图格式等于设定了相应的窗口的位图格式,并且DC和窗口的位图格式一旦确定就不能再改变。这一点只能期望以后的Windows 版本改进了。
  ----3.一个RC虽然可以更换DC,在任何时刻只能利用一个DC(这个DC称为RC的当前DC),但由于一个窗口可以让多个DC作图从而可以让多个线程利用多个RC在该窗口上执行OpenGL操作。
  ----4.现在的Windows下的OpenGL版本对OpenGL和GDI 在同一个DC上作图有一定的限制。当使用双缓存用OpenGL产生动画时,不能使用GDI函数向该DC作图。
  ----5.不建议用ANSIC在Windows下编写OpenGL 程序。这样的程序虽然具有跨平台的可移植性(比如很多SGI的例子程序),但是它们不能利用Windows操作系统的很多特性,实用价值不大。
  ----用VC来编写OpenGL程序
  ----经过上面的分析,用VC来调用OpenGL作图的方法就很显然了。步骤如下:
  ----1.先设置显示设备DC的位图格式(PIXELFORMAT)属性。这通过填充一个PIXELFORMATDESCRIPTOR的结构来完成(关于PIXELFORMATDESCRIPTOR 中各项数据的意义,请参照VC的帮助信息),该结构决定了OpenGL作图的物理设备的属性,比如该结构中的数据项dwFlags中PFD_DOUBLEBUFFER位如果没有设置(置1),通过该设备的DC上作图的OpenGL命令就不可能使用双缓冲来做动画。有一些位图格式(PIXELFORMAT)是DC支持的,而有一些DC就不支持了。所以程序必须先用ChoosePixelFormat来选择DC所支持的与指定位图格式最接近的位图格式,然后用SetPixelFormat设置DC的位图格式。
  ----2.利用刚才的设备DC建立渲染上下文RC(wglCreateContext),使得RC与DC建立联系(wglMakeCurrent)。
  ----3.调用OpenGL函数作图。由于线程与RC一一对应,OpenGL函数的参数中都不指明本线程RC的句柄(handle)
  ----4.作图完毕以后,先通过置当前线程的RC为NULL(::wglMakeCurrent(NULL, NULL);),断开当前线程和该渲染上下文的联系,由此断开与DC的联系。此时RC句柄的有效性在微软自己的文档中也没有讲清楚,所以在后面删除RC的时候要先判断以下RC句柄的有效性(if(m_hrc)::wglDeleteContext(m_hrc);)。再根据情况释放(ReleaseDC)或者删除(DeleteDC)DC
  ----所附程序说明
  ----所附的程序用MFC完成了一个简单的OpenGL作图,用OpenGL的辅助库画了一个有光照的实心圆球。OpenGL本身的函数这里就不解释了,仅对用MFC编OpenGL时需要注意的内容做一个简要的说明:
  ----1.一旦设定了一个DC的位图格式,该DC所联系的窗口的位图格式随之设定。该窗口若含有子窗口或者有兄弟窗口,这些兄弟/子窗口的位图格式没有设成与对应RC一致的格式,OpenGL在它们上面作图就容易出错。故而OpenGL作图的窗口必须具有WS_CLIPCHILDREN和WS_CLIPSIBLINGS风格,程序中在主框窗的构造函数中用LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,NULL,NULL );指定了主窗口的风格。
  ----2.在ANSIC的OpenGL编程中,由auxReshapeFunc 定义设置OpenGL视口大小和作图尺寸的回调函数。在MFC中应该由WM_SIZ消息的处理函数来完成。在ANSIC的OpenGL编程中,由EauxMainLoop定义作图的回调函数。在MFC中应该由WM_PAINT 消息的处理函数来处理。相应的,由OpenGL定义的键盘、鼠标处理函数都应该由相应的Windows 处理函数来响应。
  ----3.OpenGL自己有刷新背景的函数glClear,故而应禁止Windows刷新窗口背景。否则,当窗口需要重画时,Windows会自动先发送WM_ERASEBKGND,而缺省的处理函数使用白色的背景刷。当OpenGL使用的背景颜色不
Open3D+vs配置以及使用教程 Open3d-0.8.0+Cmake+vs2015 1.下载 简要看一下官网:Open3D Home Page Github主页:Open3D Github 注意下载版本,一定要与vs相匹配,官方有相应的说明,eg.vs2019+open3d0.10.0或者vs2015+open3d0.8.0,如果版本不匹配,会出现很多的错误。 我使用的版本是0.8.0,在release里找到相应版本,下载源码,解压缩。Open3D依赖第三方库,但已经将他们作为submodule包含在了3rdparty文件夹. 阅读详情

相关推荐

OPenGL绘制三维曲面的例子

OPenGL绘制三维曲面的例子,初学者可参考 OPenGL绘制三维曲面的例子,初学者可参考

解决opengl加载3ds模型只有一张贴图的办法!!!!

终于还是解决了,发个博客希望帮助需要的人。 用opengl记载3ds模型的时候,如果你在建模工具画的模型只是一个对象,那么在程序中贴图只能贴3ds文件的第一张图。导致每个面都只能贴相同的图 解决办法:在建模工具中将模型分离成多个对象,在导出3ds,在程序中就和建模工具中的一样了!!!

lixinhui199的博客 1853

stl、obj、3DS三种3D模型加载,使用OpenGl+GLSL框架并添加双层纹理,并完成逐顶点光照和逐像素光照(GouraudShading+PhongS)

stl、obj、3DS三种3D模型加载,使用OpenGl+GLSL框架并添加双层纹理,并完成逐顶点光照和逐像素光照(GouraudShading+PhongS)

C#结合OpenGL绘图之Tao库

转自:http://www.cnblogs.com/wangshide/archive/2012/04/14/2447499.html OpenGL support libraries GLU – Some additional functions for OpenGL programs.GLUT – The OpenGL utility toolkit. Defunct.freegl

zhengluanfeng1985的博客 3603

mybatis一个怪异的问题: Invalid bound statement not found

ssm中报一下错误: invalid bound statement (not found): me.tspace.pm.dao.userdao.getuser at org.apache.ibatis.binding.mappermethod$sqlcommand.<init>(mappermethod.Java:178) at org.apache.ib...

angyangan9569的博客 112

mybatis一个怪异的问题: Invalid bound statement not found"

mybatis一个怪异的问题: Invalid bound statement not found": 关键词:mybatis 一个 怪异 问题 invalid bound statement found  invalid bound statement (not found): me.tspace.pm.dao.userdao.getuser     at or

大米饭 525

mybatis一个怪异的问题: Invalid bound statement (not found)

Invalid bound statement (not found): me.tspace.pm.dao.UserDao.getUser     at org.apache.ibatis.binding.MapperMethod$SqlCommand.(MapperMethod.java:178)     at org.apache.ibatis.binding.MapperMethod.(

teroris的博客 479

mybatis一个怪异的问题: Invalid bound statement not found":

ssm中报一下错误:   invalid bound statement (not found): me.tspace.pm.dao.userdao.getuser     at org.apache.ibatis.binding.mappermethod$sqlcommand.(mappermethod.java:178)     at org.apache.ibatis.bindin

依木前行的博客 3027

opengl绘制3维网格线,曲面

win32编程需要 连接基本的 opengl

mybatis 有时会发生怪异的问题: Invalid bound statement (not found)

  mybatis 有时会发生怪异的问题: Invalid bound statement (not found)   类似找不到xml文件 或者 找不到接口中对应配置文件的方法   解决问题思路: 1.各种配置 、文件名字、路径都正确的情况下 ,尝试清理项目,点eclipse 菜单的project--&gt;clean   2.maven 项目  xml文件放在 src/mai...

feiteyizu 144

mybatis一个怪异的问题: Invalid bound statement not found 作者及来源: babyblue - 博客园 收藏到→_→: 摘要: mybatis一个怪异

mybatis一个怪异的问题: Invalid bound statement not found   作者及来源: babyblue - 博客园    收藏到→_→: 摘要: mybatis一个怪异的问题: Invalid bound statement (not found)

周厉的技术人生 705
上一篇: 实例动态链接库编程
下一篇: OPENGL三维图形绘制讨论
Antoinette
博客等级 码龄19年 11粉丝 28原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值