https://github.com/liyonghelpme/softRenderEngine.git php
一 soft rendering engine 介绍java
如今游戏在屏幕上渲染模型和图像,是经过opengl 或者directx api, 将顶点, 法向量以及纹理坐标,纹理图片数据提交给gpu来渲染的.git
早期pc 经过 cpu 计算, 直接在屏幕上绘制像素点来显示3d对象.github
实现cpu 上的3d 算法, 投影像素点到屏幕上,则是 属于soft rendering 软件渲染 方法.算法
一般的3d 建模软件都实现有软件渲染算法.
typescript
二:基本原理api
首先在内存中 渲染出每一个像素, 接着将这片内存数据 传入到 gpu中, 在屏幕上显示出来.app
cocos2dx 中 CCSprite 是一个能够在屏幕上显示的对象.spa
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个方向, 对于方向光源只须要一个深度缓冲。
首先对场景中的 对象渲染到光源深度缓冲中。
接着从正常摄像机位置渲染对象。 渲染每一个像素的时候,根据像素的世界坐标,计算像素对应的 光源深度贴图中的 纹理坐标, 比较 转化后的深度和 光源贴图中的深度,若是大于则 表示像素在阴影中,这时候能够调低像素颜色便可。