OpenGL(十四)环境反射 环境折射 的shader实现
程序员文章站
2022-06-11 07:59:32
...
在上一节我们讲解了如何制作天空盒,本篇文章介绍它的一个衍生功能——在物体上叠加 环境反射 。
核心原理
核心很简单,在天空盒中,视线照射到天空盒上的区域即需要绘制的部分。在环境反射中,需要绘制的区域变成了视线在物体表面的反射光线,反射光线照射到天空盒的位置即要绘制的部分。
环境反射
按照上面的说法,将法线方向传入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
上一篇: shader篇-处理复杂光照
下一篇: 32 WebGL环境光下的漫反射光的计算