opengl glsl 之绘制简单天空盒(1)

这个天空盒demo主要利用采集立方体纹理,贴合到屏幕四边形上。

天空盒的专业术语叫立体贴图。就是在单位立方体外表面贴上6张纹理。在立方体的中心点向外的各个方向为纹理的采样坐标。

这里绘制一个屏幕四边形,再经过反向变换,将NDC坐标空间变换到裁剪空间,再由裁剪空间变换到变换到模型视图空间。将视图空间点的方向作为立体贴图的纹理采样坐标,采样立方体纹理。

这里程序默认朝向-Z轴,所以实验我们可以看到一个-Z。因为立方体纹理为一个立方体的外表面,所以当以视点为中心相当于采样立方体的内表面,所以我们看到的一个-Z是左右相反的。所以在裁剪空间将左右对调。再变换到视图空间。

opengl glsl 之绘制简单天空盒(1)_第1张图片

立方体纹理:

opengl glsl 之绘制简单天空盒(1)_第2张图片

实验结果:

opengl glsl 之绘制简单天空盒(1)_第3张图片

顶点着色器:

void main()
{
    gl_Position = a_vPosition;
    
    // Force all depths to just inside the far clip plane. If we put z=0.9999
    // in the vertex attributes, it messes up the cube projection below.
    // Nobbling it here is easier.
    gl_Position.z = 0.9999;

    vec4 vPos = u_mProjectionMat * a_vPosition;
    vPos /= vPos.w;
	
	if(u_flipX<1.0)
	{
		vPos.x = -vPos.x;  
	}else
	{
		vPos.x =vPos.x;  
	}
    v_vCubemapCoord = (mat3(u_mInverseViewMat) * vPos.xyz);

}

完整源码下载:

关注公众号回复 0003 下载。

opengl glsl 之绘制简单天空盒(1)_第4张图片





你可能感兴趣的:(OpenGL)