1、球面贴图
1.1原理
在一幅平面纹理图像中对各个方向的颜色进行编码就相当于把一个擦得锃亮的完美球体放在环境的中央,然后在极远处用长焦镜头对它进行拍照。需要编码的区域就是覆盖整个纹理图像的一个圆形区域,它与纹理图像的顶、底、左、右边缘相切。这个圆形区域之外的纹理值不会对结果产生影响,因为它们不会在环境纹理中使用。
如下图:
在对实际物体进行纹理贴图时,根据实际物体上的反射向量去计算上述球体上的法线向量,通过法线向量确定纹理坐标。
1.2实现
计算出物体上某顶点的反射向量,然后通过和(0,0,1)(opengl坐标)相加再除以2得到球面的法线,法线的值就是球面坐标,然后通过球面坐标对应到纹理相应的点。
假设球面坐标 S(a,b,c)(归一化后的坐标)
则纹理坐标 T(u,v):
u = a / 2 +0.5
v = -b / 2 +0.5
顶点处理器:
// Sphere Mapping Shader
// Vertex Shader
// Richard S. Wright Jr.
// OpenGL SuperBible
#version 130
// Incoming per vertex... position and normal
in vec4 vVertex;
in vec3 vNormal;
uniform mat4 mvpMatrix;