OpenGL(十四)环境反射 环境折射 的shader实现

版权声明:本文为 松阳 (blog.csdn.net/fansongy) 原创文章,转载必须注明出处: https://blog.csdn.net/fansongy/article/details/79128108

在上一节我们讲解了如何制作天空盒,本篇文章介绍它的一个衍生功能——在物体上叠加 环境反射 。

核心原理

核心很简单,在天空盒中,视线照射到天空盒上的区域即需要绘制的部分。在环境反射中,需要绘制的区域变成了视线在物体表面的反射光线,反射光线照射到天空盒的位置即要绘制的部分。

环境反射

按照上面的说法,将法线方向传入shader中,具体编写如下:

//vs
attribute vec3 pos;
attribute vec2 texcoord;
attribute vec3 normal;
uniform mat4 M;
uniform mat4 P;
uniform mat4 V;
uniform mat4 NM;
varying vec4 V_WorldPos;
varying vec3 V_Normal;
void main()
{
    V_WorldPos=M*vec4(pos,1.0);
    V_Normal=mat3(NM)*normal;
    gl_Position=P*V*M*vec4(pos,1.0);
}
//fs
varying vec4 V_WorldPos;
varying vec3 V_Normal;
uniform samplerCube U_MainTexture;
void main()
{
    vec3 eyeVec=normalize(V_WorldPos.xyz-vec3(0.0));
    vec3 n=normalize(V_Normal);
    vec3 r=reflect(eyeVec,n);
    vec4 color=textureCube(U_MainTexture,r);
    gl_FragColor=color;
}

环境折射

环境折射实现原理与环境反射相同,只不过在计算射出光线时使用折射函数:

//fs
varying vec4 V_WorldPos;
varying vec3 V_Normal;
uniform samplerCube U_MainTexture;
void main()
{
    vec3 eyeVec=normalize(V_WorldPos.xyz-vec3(0.0));
    vec3 n=normalize(V_Normal);
    vec3 r=refract(eyeVec,n,1.0/2.4);
    vec4 color=textureCube(U_MainTexture,r);
    gl_FragColor=color;
}

总结

借助天空盒,可以很方便的实现环境反射和环境折射的效果。其中折射率有对照表,可以通过搜索引擎查到。

转载请注明出处:http://blog.csdn.net/fansongy/article/details/79128108

猜你喜欢

转载自blog.csdn.net/fansongy/article/details/79128108