|

楼主 |
发表于 2013-5-14 13:18:14
|
显示全部楼层
7. OpenGL
为什么要用到OpenGL呢?其实这个问题我也不太明白,因为我只做过一个2D游戏,虽然这个游戏还是比较复杂的,但是绝对用不到任何3D的东西。
因为不断有人跟我说,或者通过别人跟我说画面太小(其实也有少数人嫌画面大的……),所以我考虑过画面的拉伸。我所用的解决办法就是利用gfx这个库,将最终画好的表面拉伸一下,再输出到真实的屏幕上去。这时如果不使用平滑,当拉伸的比例不是一些特殊的数字的时候,整个画面就像一块破布,非常难看。如果使用了平滑,游戏的帧数下降有点让人不能容忍。
简单地说,用CPU来计算平滑效果是一个错误的选择,所以更好的方法自然是利用显卡来进行平滑拉伸,OpenGL的纹理贴图正是一个合适的方案。
另外SDL_Image(我想ttf也可以吧)与OpenGL配合来载入一些图片作为纹理,也是很常见的情况。
sdl的表面转为OpenGL的纹理,可以使用以下的代码(uses中需要添加gl和glext):
- TextureID: GLUint;
- ..............
- glGenTextures(1, @TextureID);
- glBindTexture(GL_TEXTURE_2D, TextureID);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, scr.w, scr.h, 0, GL_BGRA, GL_UNSIGNED_BYTE, scr.pixels);
- if SMOOTH = 1 then
- begin
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- end
- else
- begin
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- end;
复制代码 这里针对是否使用平滑的情况设置了放大和缩小时使用的方式,LINEAR是平滑,NEAREST是不平滑。如果把这个纹理贴到整个屏幕上,代码是这样的:
- glENABLE(GL_TEXTURE_2D);
- glBEGIN(GL_QUADS);
- glTexCoord2f(0.0, 0.0);
- glVertex3f(-1.0, 1.0, 0.0);
- glTexCoord2f(1.0, 0.0);
- glVertex3f(1.0, 1.0, 0.0);
- glTexCoord2f(1.0, 1.0);
- glVertex3f(1.0, -1.0, 0.0);
- glTexCoord2f(0.0, 1.0);
- glVertex3f(-1.0, -1.0, 0.0);
- glEND;
- glDISABLE(GL_TEXTURE_2D);
- SDL_GL_SwapBuffers;
- glDeleteTextures(1, @TextureID);
复制代码 最后一句视情况是否删除这个纹理。因为OpenGL是一个3D引擎,所以4个顶点是可以任意设置的,这就可以非常简单地实现任何的扭曲,旋转,拉伸效果,而且因为利用的是显卡来计算,基本上不会拖慢游戏速度。
|
|