cocos2dx 实现软渲染引擎 soft rendering engine

http://blogs.msdn.com/b/davrous/archive/2013/06/13/tutorial-series-learning-how-to-write-a-3d-soft-engine-from-scratch-in-c-typescript-or-javascript.aspx


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


https://github.com/liyonghelpme/softRenderEngine/tree/shadowMap


shadowMap 算法基本原理 需要一个 从光源角度 获取场景的一个深度纹理,对于点光源,需要做一个cube  map 6个方向, 对于方向光源只需要一个深度缓冲。

首先对场景中的 对象渲染到光源深度缓冲中。

接着从正常摄像机位置渲染对象。 渲染每个像素的时候,根据像素的世界坐标,计算像素对应的 光源深度贴图中的 纹理坐标, 比较 转化后的深度和 光源贴图中的深度,如果大于则 表示像素在阴影中,这时候可以调低像素颜色即可。





posted @ 2014-06-26 12:51  liyonghelpme  阅读(255)  评论(0编辑  收藏  举报