Random Posts
Tags
Categories
Recent Comments
- 小肥 on GDB 从裸奔到穿戴整齐
- flandre on 异步事件模型的 Self-pipe trick
- inv on 异步事件模型的 Self-pipe trick
- skywind on 异步事件模型的 Self-pipe trick
- skywind on 异步事件模型的 Self-pipe trick
Links
Meta
Monthly Archives: August 2016
256字节3D程序是如何实现3D引擎的呢?
网上有很多 256 个字节实现图形渲染的 “引擎”,他们的原理是什么呢? 全都不是基于正统3D引擎的多边形绘制,而是基于少数特定情况的简化版光线跟踪算法 只能渲染特定几种物体,并不能渲染通用物体。 无资源或者少资源(基本靠生成),重复 16位代码,COM格式的可执行(没有PE头,代码数据和栈都在一个段内,指针只有两字节) 尽可能用汇编来写 你自己花点时间也能做出来, 具体解释一下: 简化版的 raycasting,实现起来的代码量比通用的多边形绘制方法至少 N个量级。 基本的光线跟踪,在 320×200 的解析度下,从摄像机中心射出 320×200条光线,屏幕上每个点对应一条光线,首先碰撞到的物体的位置颜色,就是屏幕上这个点的颜色: 可以描述为下面这段代码: for (int y = 0; y < 200; y++) { for (int x = 0; x < 320; x++) { DWORD … Continue reading
Vim 异步运行 Shell 指令的插件 – AsyncRun
自制另一个新的 Vim 8.0 专用异步插件:asyncrun.vim,它可以让你在 Vim 里面异步运行各种 Shell 指令并且把结果实时输出到 Quickfix,需要 Vim 7.4.1829 以上版本。 安装方法 到插件首页 https://github.com/skywind3000/asyncrun.vim 下载项目,并拷贝 asyncrun.vim 到你的 ~/.vim/plugin。或者使用 Vundle 指向 skywind3000/asyncrun.vim 来自动更新。 基本教程 使用 gcc 异步编译当前文件: :AsyncRun gcc % -o %< :AsyncRun g++ -O3 % -o %< -lpthread 该命令会在后台运行 … Continue reading
3D 图形光栅化的透视校正问题
写了文章《如何写一个软件渲染器》以后,不少网友希望进一步解释背后的数学公式,询问以及自己加一个 phong 光照该如何加,本文将对透视纹理映射的插值原理做一个简单的解释,希望能帮助到大家: 透视纹理绘制发生在最后阶段,坐标已经完成 projection,剔除,裁剪了,然后顶点/w,开始批量绘制扫描线之前,这时候开始计算纹理的位置。 使用 w 还是用 z,关系不大,早年的 3D 引擎,直接 /z 的,只是后面标准化了以后,发现 w 更好用,可以同时表示透视投影和正交投影。同时顶点经过标准的 mvp 矩阵运算后,w 和 z 是承线性关系的,方便对 z/w 做 [0,1] 的 cvv 裁剪。你可以理解成 w 就是另外一个 z。以前屏幕坐标: x’ = x / z * d + A y’ = … Continue reading
如何用 OpenGL 封装一个 2D 引擎?
如何正确的使用 OpenGL “封装一个2D引擎” ?以下几个步骤: 1. 别用什么 glBegin/glEnd,至少写兼容GLES2代码,不然手机上跑不起来。 2. 用两个三角形的纹理拼凑出一个2D的图块出来,不是搞啥每个点自己画。 3. 2D图像库基本就是要把显示对象树给做出来就得了。 4. 每个显示对象除了自己外还有很多儿子节点。 5. 每个显示对象有一个变换矩阵,用来设置位置和角度还有缩放,最后是节点的显示效果。 6. 渲染的时候需要从远到近排序,并尽量归并相同效果(fs)及纹理。 7. 把常用纹理管理起来,提供资源加载,可以换进换出,提供类 LRU的机制。 8. 在此基础上提供一些动画(精灵)和场景控制的api,提供显示字体,即可。 最后推荐两个现成的轻量级2D引擎供阅读: StarEngine:GitHub – StarEngine/engine: Crossplatform C++11 2D Game Engine for Desktop and Mobile games EJoy2D:GitHub – ejoy/ejoy2d: A … Continue reading