当前位置:0101部落 >> 技术文档 >> 游戏图形 >> 浏览文章 【字体:
给我一个画点函数,我能描绘出整个世界
作者:董凯 日期:2007年08月04日 阅读次数: 来源:本站原创
 

    wndClass.lpfnWndProc=WndProc;

    wndClass.lpszClassName="WinGDI";

    wndClass.lpszMenuName=NULL;

    wndClass.style=CS_HREDRAW|CS_VREDRAW;

    return RegisterClass(&wndClass); /* 注册窗口类 */

}


些时的你也许会有些沮丧,上面有差不多90行代码,也就是说为了画这个点,我们需要八十多行的外围代码,这些代码分别被用来创建并注册窗口,显示和刷新窗口,接收及处理消息,在其它库的支持下画点不过十几行的代码量一下子增加了五六倍…… 这些都是事实,但是也没有关系,在Windows下面写程序是需要这样子的,这也是初学者一般都从控制台程序学起的原因,就是为了避开这些繁杂的东西而专业掌握语言本身的特性。不要因为这样而紧张或不知所措,其实不管你要写个多大的Windows程序,也只需要这么多的准备代码了,也就是说画一个点需要这么多,画一万个也只需要这么多,而且这些准备代码都是些公式化的东西,我在初学者应该了解的代码行中都加上了注释,记住了就行了,以后再写别的程序这个框架都一直能用的上,最后建议去了解一下CreateWindowEx()和相应的RegisterClassEx(),虽然功能相似,但这两个是扩展版本,现在更加常用。


《DDRAW篇》

DDRAW全称是DirectDraw,是微软DirectX的一部分。DirectX(以下简称DX)是一种应用程序接口,目前的版本是9.0c,它可让以Windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。DX基于COM而不是建立在消息机制上的,它可以绕过消息机制直接与硬件打交道,所以在制作对性能要求比较高的Windows图形程序时需要用到它的接口。DX是由很多API组成的,按照性质分类,可以分为四大部分,显示部分、声音部分、输入部分和网络部分,我们要讨论的DDRAW就是显示部分中针对2D编程的模块(其实目前版本的DX已经将原来分离的DDRAW和D3D合在一块了统称为Direct Graphics),DDRAW在DX 7.0中就已经趋于完善,之后的DX版本更新主要是增强D3D的功能。在DDRAW中,并未提供专用的画点函数,我们有几个可以解决这个问题的方案:一是使用它的画线函数DrawLine()画一段只有一个像素长的“线”,也就是一个点了;二是使用成员函数Lock()将页面锁定,就可以得到页面的首地址,然后通过一定的偏移量计算,就可以得到任意一个坐标的内/显存地址,再将点的颜色信息写入到该地址,解锁Unlock()即可;三可以创建一个1*1的surface再blt到页面中等等。这里只列举三种,其它的方法大家可以自行讨论。要使用DX进行开发,需要下载相应的包将库文件安装到你的编译环境中去,VC++的可以到微软官方下载页面获得,DEV-C++的根据之前提到的链接下载到相应的捆绑版中除了Allegro还有DX 8的必要文件,至于DX 9的DEVPAK包则可以到VIRX的主页http://vrixpworld.rjdown.com中下载的到,那里还有Allegro4.2.0及SDL的DEVPAK。另外为了告诉编译器我们需要使用DirectDraw,我们要在程序文件中#include ,并把"ddraw.lib"和"dxguid.lib"加入工程。记住,做完了这些工作后DirectDraw程序才能被正常编译。由于能工作的源码同样会比较长,今天由于时间问题就不写了,大家也可以到网上查查相关的资料。


《OpenGL篇》[注:OpenGL一节为编程中国论坛C图形程序版主starrysky提供,在此表示感谢!]

对于很多人来讲,说起OpenGL,首先便会想到游戏,特别是经典的FPS游戏Quake(雷神之锤)系列,它是有史以来最受欢迎的3D游戏之一,它的作者John Carmack 用一个星期使用OpenGL将其重新编写之后,引起了游戏界的一片喧哗。然而,游戏只是OpenGL应用领域的冰山一角。
严格的讲, OpenGL被定义为"图形硬件的一种软件接口",它是一种功能强大,精巧复杂的3D图形API(应用程序编程接口).OpenGL并不象C/C++一样是一门编程语言,从本质上说,它是一个3D图形和模型库,具有高度的可移植性,并且有非常快的速度.它拥有的命令超过300个,覆盖了从设置材料颜色和反射属性到执行旋转和复杂的坐标转换等功能.它具有比Direct3D更简洁的代码和更高的效率,但这也使向Direct3D投入了大量资鸬奈⑷砉靖械嚼媸艿酵?而在初期大力打压OpenGL.然而,OpenGL强大的功能和易于使用的特点使得它得到了越来越多的开发人员的认可和支持,面对越来越多的受GpenGL支持的软件,硬件商们不得不开发更好的OpenGL硬件和高质量的驱动程序.今天,OpenGL已经得到了广泛的承认和接受,成为实时3D图形的行业标准API.

下面我们就来看看怎样用OpenGL来画一个点
考虑到很多人没有安装BC++6.0, 下面这个程序是用VC++6.0编译的。
以下是源代码


#include "glut.h" 
//#include

//绘制场景
void RenderScene(void)
{
// 用当前清除颜色清除窗口
glClear(GL_COLOR_BUFFER_BIT);
    
    // 首先设置画图用的颜色,这里设置成了红色
  //     红  绿    蓝
glColor3f(1.0f, 0.0f, 0.0f);
//这个函数的所有参数都在0.0到1.0之间,后缀f是表示参数是浮点型的
//有时为了表现象玻璃一样的透明效果,会用glColor4f(1.0f, 0.0f, 0.0f,1.0f);
//最后的那个1.0f是透明度,0.0f表示全透明,1.0f是完全不透明
 
    
// 开始画图了,应斑竹大人的要求画一个点,不过一个点也太难找了吧,所以要画大点
//设置点的大小,默认大小是0,画出来的点很小,这里大小设置成3
glPointSize(3);
//设置成画点的模式
glBegin(GL_POINTS);
    //glVertex3f(x,y,z),在坐标(x,y,z)处画一个点,多画一个点就多加个函数,自己加个点或改改坐标试试
//因为窗口大小为800x600,所以点的坐标范围为(-400,-300,z)到(400,300,z)
      glVertex3f(0.0f,0.0f,0.0f);
      // glVertex3f(25,5,0);
      //把上面函数前面的//去掉看看加一个点是什么情况
    //结束绘画
glEnd();

// 刷新绘图命令,强制完成所有绘画,这句话表示全部图形绘制完成
    glFlush();
}


// 设置渲染状态(听起来满下人,实际上很简单)

上一页      下一页
本文共 4 页,第  [1]  [2]  [3]  [4]  页

相关文章:
  • 暂无相关链接
  •  
     
      ·关于我们 ·访客留言 ·友情链接 ·
    粤ICP备08022036号
    站长:ds1010 站长信箱:0101ds@gmail.com

    0101部落开发 @ www.ds0101.net 2007-2008