博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2dx 实现软渲染引擎 soft rendering engine
阅读量:6273 次
发布时间:2019-06-22

本文共 1158 字,大约阅读时间需要 3 分钟。

hot3.png

一 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 阴影贴图

 

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

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

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

转载于:https://my.oschina.net/u/186074/blog/284357

你可能感兴趣的文章
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
Android下创建一个sqlite数据库
查看>>
数组<=>xml 相互转换
查看>>
MFC单文档应用程序显示图像
查看>>
poj 2777(线段树的节点更新策略)
查看>>
Swift-EasingAnimation
查看>>
[翻译] BKZoomView
查看>>
C++类设计的一些心得
查看>>
tableVIew删除时的delete按钮被挡住时重写的方法
查看>>
读cookie中文字符乱码问题
查看>>
招募译者翻译并发数据结构
查看>>
普通表转换为分区表
查看>>
Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较
查看>>
性能优化总结(六):预加载、聚合SQL应用实例
查看>>