cocos2dx 实现软渲染引擎 soft rendering engine
https://github.com/liyonghelpme/softRenderEngine.git
一 soft rendering engine 介绍
现在游戏在屏幕上渲染模型和图像,是通过opengl 或者directx api, 将顶点, 法向量以及纹理坐标,纹理图片数据提交给gpu来渲染的.
早期pc 通过 cpu 计算, 直接在屏幕上绘制像素点来显示3d对象.
实现cpu 上的3d 算法, 投影像素点到屏幕上,则是 属于soft rendering 软件渲染 方法.
通常的3d 建模软件都实现有软件渲染算法.
二:基本原理
首先在内存中 渲染出每个像素, 接着将这片内存数据 传入到 gpu中, 在屏幕上显示出来.
cocos2dx 中 CCSprite 是一个可以在屏幕上显示的对象.
CCTexture2D 对应gpu中的资源,可以将 内存中生成的纹理数据 传给CCTexture2D 通过CCTexture2D 传入到 gpu中.
kazmath 库可以帮助来做3d 矩阵计算.
渲染一个3d 对象基本流程是:
使用modelview 矩阵变换对象, 使用projection 矩阵计算出定点在屏幕上的位置.
根据需要绘制的对象 采用不同的算法,进行像素点的填充.
二 绘制点
对定点做 两个矩阵变换之后, 得到的就是定点在屏幕上的位置, 直接根据这个位置修改对应 像素点的值即可.
三 绘制线
采用中点递归算法绘制 线, 取线段中点, 分别递归绘制 两个子线段即可.
四 填充三角面片 以及z buffer 算法
采用扫面线算法绘制三角面片 逐行在屏幕上绘制即可.
五 光照 shade 着色
flat shading
gouraud shading
拥有了扫描线算法之后, 可以在着色阶段, 进行像素点的光照颜色插值, 即可绘制每个像素的光照颜色.
六 纹理贴图
类似于光照着色. 这里建模时给每个定点确定纹理坐标. 接着程序中加载纹理图片, 在着色阶段,对每个像素点 插值计算纹理坐标, 接着查询 加载的纹理图片对应点的颜色, 着色即可.
需要注意的是 blender 中模型的纹理坐标 和图片像素数据的坐标的Y 轴方向是相反的.
七 shadowMap 阴影贴图
http://fabiensanglard.net/shadowmapping/index.php
shadowMap 算法基本原理 需要一个 从光源角度 获取场景的一个深度纹理,对于点光源,需要做一个cube map 6个方向, 对于方向光源只需要一个深度缓冲。
首先对场景中的 对象渲染到光源深度缓冲中。
接着从正常摄像机位置渲染对象。 渲染每个像素的时候,根据像素的世界坐标,计算像素对应的 光源深度贴图中的 纹理坐标, 比较 转化后的深度和 光源贴图中的深度,如果大于则 表示像素在阴影中,这时候可以调低像素颜色即可。