-
每顶点光照计算与每片元计算的对照表 - PT100换算
资源介绍
6.5 光照的每顶点计算与每片元计算
22 1,0,0, 1,0,0, 1,0,0, 1,0,0, 1,0,0, 1,0,0, //右面上 6 个顶点的法向量
23 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, //上面上 6 个顶点的法向量
24 0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0, //下面上6个顶点的法向量
25 };
26 ByteBuffer nbb = ByteBuffer.allocateDirect(normals.length*4);
//创建绘制顶点法向量缓冲
27 nbb.order(ByteOrder.nativeOrder()); //设置字节顺序
28 mNormalBuffer = nbb.asFloatBuffer(); //转换为 float 型缓冲
29 mNormalBuffer.put(normals); //向缓冲区中放入顶点法向量数据
30 mNormalBuffer.position(0); //设置缓冲区起始位置
31 }
第 3-17 行为立方体各顶点位置数据的初始化。
第 18-30 行为立方体各顶点法向量数据的初始化,其中给每个顶点设置了其所属面的法向量。
(2)接着介绍采用点法向量策略的案例 Sample6_8 中初始化立方体顶点及法向量数据的
initVertexData 方法,其代码如下。
代码位置:见随书中源代码/第 6 章/Sample6_8/src/com/bn/Sample6_8 目录下的 Cube.java。
1 public void initVertexData() { //初始化顶点数据的方法
2 vCount = 6 * 6; //顶点数
3 float vertices[] = new float[] {
4 ……//此处省略了初始化立方体 6 个面各个顶点坐标数据的代码
5 ……//需要的读者请自行查看随书中的源代码
6 };
7 ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
//创建顶点坐标数据缓冲
8 vbb.order(ByteOrder.nativeOrder()); //设置字节顺序
9 mVertexBuffer = vbb.asFloatBuffer(); //转换为 float 型缓冲
10 mVertexBuffer.put(vertices); //向缓冲区中放入顶点坐标数据
11 mVertexBuffer.position(0); //设置缓冲区起始位置
12 float normals[] = vertices; //顶点法向量数据
13 ByteBuffer nbb = ByteBuffer.allocateDirect(normals.length * 4);
//创建绘制顶点法向量缓冲
14 nbb.order(ByteOrder.nativeOrder()); //设置字节顺序
15 mNormalBuffer = nbb.asFloatBuffer(); //转换为 float 型缓冲
16 mNormalBuffer.put(normals); //向缓冲区中放入顶点法向量数据
17 mNormalBuffer.position(0); //设置缓冲区起始位置
18 }
提示
由于本案例中原始情况下将立方体的几何中心放在了坐标原点,因此,每个顶
点的平均法向量就没有必要真正进行求和再平均的计算了,直接采用顶点的 x、y、z
坐标代替即可。但开发中并不总是像本章的案例一样可以进行简化,后面的章节会
给出需要详细计算的案例。
6.5 光照的每顶点计算与每片元计算
细心的读者会发现,本章前面的案例都是在顶点着色器中进行光照计算的。这是由于在顶点
着色器中对每个顶点进行光照计算后得到顶点的最终光照强度,再由管线插值后传入片元着色器
以计算片元的颜色,这样一方面效率比较高,另一方面产生的光照效果也不错。
但由于这种计算方式插值的是基于顶点计算后的光照强度,因此在要求很高,希望有非常细
腻光照效果的场合下就略显粗糙了。本节将介绍另一种光照计算方式,其首先将插值后的法向量
数据传入片元着色器,然后在片元着色器中进行光照计算。这种新的方式也称为每片元光照,可
以取得为更细腻的光照效果。
进行案例开发之前,需要首先了解一下本节两个案例(Sample6_9 和 Sample6_10)的运行效
果,具体情况如图 6-21 所示。
- 上一篇: CXP-001-2021.pdf
- 下一篇: jrtp库资源-jrtplib