实时3d引擎纯软件实现笔记

来源:互联网 发布:辣条骚淘宝网址 编辑:程序博客网 时间:2024/06/10 20:23

光: 

简单light mapping 的方法 :
color_texture[x][y] = alpha * org1[x][y] + (1- alpha) * org2[x][y]
单是动态的修改alpha值就可以得到很好的动画效果

计算点的光亮度的 normal 即 向量还的 是从 相临的 面向量的平均值得到(而这个面向量是从三角形的两边的叉乘得到的)。。。

影:

可以完全不管被遮挡面而用公告板,如果严肃点的话就目前都用stencil shadow volume.其实,也是比较简单的,但是必须在object sapce空间发生,解成三角形表之后就没办法计算一个物体被光源所切的最大截面了,这个截面可以通过与光源交角大于90度的顶点的外包围算出来(把这些点组成的三角形的边加起来出现次数大于1的都是内部边),然后,给个适当的长度用这个截面生成一个梯形体(对着光源),然后对z缓冲里的点来看这些点是不是在这个体里,是的话就减弱光..(当然没有讨论聚光灯和soft shadow...差不多够使就好了。...)

词汇:

diffuse 漫反射 不论视角
specular镜面反射 根据光源 视角
emissive 自色
directional lights 平行光
point lights 点光源 光密度随距离变化
聚光灯 通过内光圈 外光圈 的区别来模拟 衰减度计算的精确度需要看画面质量而定

材质计算:

guoraud shading for texture
发生: screen space 简单来说就是将三角形三个点的颜色值根据点向量来取平均数来
给三角形内点取颜色
phong shading for texture
发生:与前者不同取的是三角形点的向量的平均。。。过于浪费。。。连硬件实现都没有。。

所谓 UV 蒙图的意思是说
把长方形蒙到三角形上
你定了三角形一个点之后左右两条边然后定一边map 长方形的 u 一边 map 长方形的v 然后再一行行的插值就是了 (或压缩)

 

实时渲染的  texture 插值法,纯粹的 线形插值。。。
des[i] = src[ floor(int(ratio * source.size * i)) ]
相当粗糙的方式。。
还记得高数还是图形学里头有相当复杂的至少是2次的插值法。。。。
顶多再对插值之后的点像临点再做个平均 叫做
bilinear 插值。。。。2维的话 就对 四个点 做一次 平均 没什么技术含量


 

线:


实际上 d9绘三角形不是全部都画出来 而是只画 top-left 的
换句话说有条边是不会画的 目的是为了三角形重叠的时候不多画

 数据结构:

3d里的数据原则: 尽量不去移动数据而是移动它们的指针这在index表和画家算法充分体现了

实际上 一个三角形 的 数据结构定义有很多东西的 坐标 向量 颜色

其中 向量 颜色 包括本 三角形 的 也包括 组成这个三角形的 点的
渲染方式 然后 引擎再决定怎么操作它 通用引擎应该把 这些数据都包含了

虽然一路经过pipeline 最后都影射了很多数据都是要保留的 copy数据是不可避免的

渲染方式需要的包括 付单色 gourad 付色 透明与否 贴图否
 通用引擎结果可能在处理的时候可能会有冗于的情况发生

 

 

顶点编程的必要性:

因为实际上如果是 gourad 着色的话 只是单色的三角形的话甚至只是map单色材质就可以了或者定义三角形的颜色
顶点是必须有颜色的现在问题来了 。。顶点的颜色一开始是怎么来的?
材质的边缘的颜色显然不可以作为顶点的初始化颜色,而当然主要是通过
光源表对起的叠加操作来做的但是如果想要有更灵活的方式的话就得手动来做这件事情了,无论是软件的库还是硬件的显卡光源表最多有平行光点光加简单聚光灯的光源定义太不够了,必须可以编程才可以
  换句话说实际上硬件卡或软件库只会有平行,点光,简单聚光的函数你想要干其他的都不行,没有接口!

 

3d优化方法:

函数值尽量预先生成然后查表:内存便宜。。。几兆的键值表不算什么

而且
SIMD single instruction multiple data指令集关键的时候还的用。。。 

原创粉丝点击