C语言windows,OpenGL编程

发布网友

我来回答

5个回答

懂视网

在opengl中可以绘制二维图像,分为两种,BITMAP和image 1.bitmap和image的区别有: bitmap中对图像的每个像素只存储一位(0或1),用来表示用当前颜色绘制还是不绘制,而image是图像的每个像素存储可能很多位,存储它的各个通道的颜色信息; bitmap是绘制在

在opengl中可以绘制二维图像,分为两种,BITMAP和image

1.bitmap和image的区别有:

bitmap中对图像的每个像素只存储一位(0或1),用来表示用当前颜色绘制还是不绘制,而image是图像的每个像素存储可能很多位,存储它的各个通道的颜色信息;

bitmap是绘制在三位空间中的一群点,其中每个点都受各变换矩阵的影响,等同于一群Gl_begin(GL_POINTS)操作联合在一起 ,而image是直接绘制在帧缓存上,在绘制原点所投影到的屏幕坐标处开始绘制,就是直接在二维屏幕上绘制,就像普通的二维绘制一样,他只有那个绘制的原点受变换矩阵的影响,比如当原点的位置被裁剪掉之后,整张图片也将消失。

bitmap是绘制在三位场景的一些点,也就是每个点都会有法向等信息,回收光照等影响,拉近看还会发现点间的距离,image是直接写入帧缓存的,绘制的颜色就是最终看到的颜色, 像素点间不会有距离

2.bitmap的绘制步骤

glColor3f制定当前绘制的点的颜色

glRasterPos2f定义当前的绘制原点(OPENGL绘制的原点是在左下角的,即定义之后,都是从这点开始按照从左至右,从下至上绘制的)

只有当调用了 glRasterPos2f之后,他前面的glColor3f才会起作用,所以要先设置颜色,再定义原点

void glBitmap( GLsizei width, 绘制宽度的点数
GLsizei height, 绘制高度 的点数
GLfloat xorig, 在以原点的二维坐标系中的X坐标
GLfloat yorig, 在以原点的二维坐标系中的Y坐标
GLfloat xmove,绘制后原点的横向位移
GLfloat ymove,绘制后原点的纵向位移
const GLubyte * bitmap 存储的数据);
绘制存储在内存中的数据

其中bitmap中存储的数据按照从左下角起8位对其(一个GLUBYTE),例如下图的数据就应该因该存储为

0xc0, 0x00, 0xc0, 0x00, 0xc0,0x00, 0xc0, 0x00, 0xc0, 0x00,0xff, 0x00, 0xff, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,0xff, 0xc0, 0xff, 0xc0。如果width不是八的倍数,比如是30个点,那么这一行仍然要占8的倍数位,应占用4个字节,最后面的两位将被自动舍弃。

bitmap更适合绘制颜色较单一,且需要能进行三维观察的图

他也可以绘制彩色图,只是要每个点绘制前改变当前绘制颜色,如图

2.image的绘制步骤

2.1glPixelStorei()设置数据的存储和解读方式,这里可以进行的常用设置有

GL_PACK_SWAP_BYTES改变一个像素各个成分(不是颜色通道的顺序)的顺序,比如原先的存储顺序为(颜色、深度、索引),颠倒后为(索引、深度、颜色),而一个颜色的通常都存储为RGB。这个设置通常不用改变

剪裁图像:比如我们只要绘制在内存中图像数据中的一个矩形区域,原图为0*480,我们需要绘制从(10,10) 开始长100,宽100的区域到屏幕。我们需要先用glPixelStorei(GL_UNPACK_ROW_LENGTH,0)设置图像的原宽为0,再用glPixelStorei(GL_UNPACK_SKIP_ROWS,10)设置我们跳过了10行,然后用glPixelStorei(GL_UNPACK_SKIP_PIXELS,10)设置我们又把起点跳过了10个像素(列),最后调用glDrawPixels(100,100...)来绘图。

2.2glPixelTransferf设置像素的传递和映射,用这个操作,可以在存储或读取时将特定的颜色映射到一种颜色,或者将特定颜色的值扩大缩小等

2.3glPixelZoom(x,y)设置几何变换,这将设置最后图像的一个像素在X/Y方向上被放大的倍数,都是2则放大四倍,如果为负数在读取时进行镜像

2.4调用glDrawPixels绘制存储在内存中的图像到帧缓存上

或调用glReadPixels读取帧缓存上的数据到内存中(可以做截图用)

或调用glCopyPixels拷贝帧缓存的一处数据到帧缓存的另一处(觉得很适合做赛车游戏的后视镜 ^^)

热心网友

查找 MSDN 可以得知,MSG 里面的 pt 坐标是相对于窗口的左上角的;

2. 至于声音控制和播放,可以使用 Windows 自带的 MCI API,或者使用 DirectSound 来播放,我推荐你使用 un4seen 的 BASS,简单实用强大,一两个函数就可以播放音效了;

3. 你要使用 alpha blend 与桌面进行镂空运算,就必须首先获得桌面的窗体句柄,OpenGL 的 alppha 运算我不是很懂,不过 Direct3D 的话就简单多了;

4. 屏幕常亮,其实就是阻止系统进入休眠状态,每当系统要进入休眠状态之前,都会向系统的所有窗口发送一条消息,你拦截这条消息,进行特别的处理就可以防止系统进入休眠了,至于是什么消息,请查看 MSDN,我也好久没用过这条消息了;

5.bmp 文件可以保存 alpha 通道,使用 32bit 色深的 bmp 文件就可以了,RGB 分别 8bit,alpha 通道 8bit,不过说到 alpha 通道,tga 或者 png 图片更加合适,因为他们可以进行无损压缩;

6.用 GetPocAddress 导出函数,只能用类型强制转换,这个是 windows 的原则,我们只能去迎合它了 ... 

7. 执行 NULL 指针的话,不同的系统会有不同的反应,XP 是直接程序崩溃,Vista 或者以上的系统,就会提示无响应

8. 如果你建立的工程是 Win32 窗口程序,那么就不会有 DOS 窗口,如果你建立的是 Win32 控制台程序,那么就会有 DOS 窗口;如果你使用 OpenGL 实用库来创建 OpenGL 程序,那个 DOS 窗口是无法消除的,它可以帮助你进行错误排查

9. 不要用 Dev C++ 了,用 VS2010 吧,这是行业规范


最后,祝楼主学习愉快

热心网友

纯C有点难啊。也不要在游戏开发人员可以了解过夜,建议学习C + +。再看看你特别想开发平台。传统的Windows,则您可以学习一点Windows程序设计和直接DirextX编程。苹果再转移目标C的Android,然后转移JAVA。网页游戏转移的ActionScript。除了Windows使用DirectX 3D方面,其它的是OpenGL的,Windows还可以使用OpenGL。

对于苹果,Android和网页游戏我不太了解,对有关Windows的DirectX学习

Windows程序设计的几本书推荐:

查尔斯Petzold的Windows程序设计第五版(很老的书,而是一个基于Windows的程序设计)

的Windows核心编程第五版(本非常好的书,有人可能会开始看到有点难度,但提供了一个Windows程序的性能质量是绝对有帮助)

的DirectX方面

弗兰克Luna的介绍的基础上(对DirectX的3D游戏编程与DirectX 9.0cA着色方法,但似乎没有中国版本不建议在以前的版本的介绍与DirectX 9.0 3D游戏编程,因为以前的版本是基于DX的固定管道,而不是着色器9,固定管道的DX10从一开始就已经取消了,这所学校的不是之前的未来)

王在精通DirectX 3D图形与动画程序设计(觉得DirectX的中国书籍中最好的,最全面的一个)

的OpenGL方面

OpenGL编程指南第七版(所谓的OpenGL红宝石本书中,我们建议,但我还没有看到。我听说中国translation很烂)

如果你只是想作一个简单的2D游戏,那么你就可以直接的C + +的一些完成后,考虑到学校的2D游戏引擎做的,如HGE。 3D游戏引擎,建议要学会去与DX或OpenGL。追问首先感谢这位的尽心回答,但是我只剩下一天的时间,不会C++不会Direct,目标平台就是windows

热心网友

1.MSG的坐标 查阅wm_mousemove消息

The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.
The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.

2.绝对不要把UI线程放入子线程, 一切UI操作留给主线程。

3.窗口是不属于OpenGL范畴的, 取决于系统, 所以OpenGL的像素透明不能让窗口透明

4.有相应的API和结构 比如WNDCLASS

5.既然图像用OpenGL为什么声音不用 OpenAL

6. SystemParametersInfo()来关闭屏幕保护程序,结束后再重新打开

7.bmp 文件可以保存 alpha 通道

8.导入数据直接先dll导出静态库 然后头文件声明即可

9.使用typedef函数

10.取决于系统是否安装了系统级调试器以及一系列的其他设定 不同机器上不同表现 

11 使用gcc手工编写makefile即可  一切尽在掌握 另外Dev Cpp是基于makefile的 没有任何你看不懂的操作 你看不懂 只能说明你还没达到能看的懂的水平

12.建立win32工程即可

13.Dev C++最高版本是4.9.9.2 你说的版本是个二道贩子接手的 自然bug很多

追问能给我粗略的讲一下makefile的工作机制和基本应用吗,有时间我会查资料的

追答target ... : prerequisites ...
command
...
...

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。(任意的Shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。

说到底,Makefile的东西就是这样一点

热心网友

dev c++不发展了,codeblocks替代了它。http://www.codeblocks.org/

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com