难点在于如何理解3D纹理和顶点的映射。
遗留问题,怎么我看到的原纹理是倒置的。
P293
在红宝书中提到:
为了确定某个特定的片段所使用的纹理(以及纹理单元),当前纹理(s,t,r)首先根据s/t/r中最大绝对值(主轴)以及它的符号(方向),在6个纹理中选择其一。剩余的两个坐标除以坐标的最大值,得到新坐标(s',t'),以查找立方图纹理中那个被选择的纹理对应的纹理单元。
立方图纹理的原点在其几何中心,即正方体的几何中心。
球体纹理:
在球体上折射环境纹理,需要取一条从观察点到这个点的光线,然后把这条光线从表面反射出来,这条带有环境纹理颜色的放射光线的方向完全决定了这个点需要绘制的颜色。
而需要编码的顶点或片段区域是一个圆形区域,它与纹理图像的顶、底、左、右边缘相切,圆形区域之外的纹理值不会对结果产生影响,因为她们不会在环境纹理中使用。
创建环境纹理图像后,需要在球体表面找到一个与被渲染物理的点具有相同正切面的点,并且把球体上这个点的颜色绘制成那个物体对应点的颜色。
GL_SPHERE_MAP 是球体纹理映射的的函数标示常量。其原理如下:
1)u是从原点指向顶点的单位向量(在视觉坐标中,即惯性坐标系)
2)n'是当前法线向量,在变换为视觉坐标系之后
3)r是放射向量(Rx,Ry,Rz)T,它是通过u-2n‘(n’T)u这个公式计算,即vp脚本中的reflect函数
4)中间值m = 2*sqrt(Rx^2+Ry^2+(Rz+1)^2)
5) s = Rx/m +1/2, t = Ry/m +1/2
通过上述的解释可以确定一件事,球面折射的实现需要在glsl中做顶点和折射处理即可,不需要绑定纹理
//skyBox.vp
#version 330
in vec4 vVertex;
uniform mat4 mvpMatrix; // Transformation matrix
smooth out vec3 vVaryingTexCoord;
void main(void)
{
vVaryingTexCoord = normalize(vVertex.xyz);
gl_Position = mvpMatrix * vVertex;
}
//skyBox.fp
#version 330
uniform samplerCube cubeMap;