使用立方体贴图,还可以给物体反射和折射的属性。
反射
片元着色器
#version 450 core
out vec4 FragColor;
in vec3 Normal;
in vec3 Position;
uniform vec3 cameraPos;
uniform samplerCube skybox;
void main()
{
vec3 I = normalize(Position - cameraPos);//计算入射光线方向
vec3 R = reflect(I, normalize(Normal));//运用reflect函数计算反射光线方向
FragColor = vec4(texture(skybox, R).rgb, 1.0);//将该点反射方向的纹理应用在该点,即反射纹理
}
顶点着色器
#version 450 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
out vec3 Normal;
out vec3 Position;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
Normal = mat3(transpose(inverse(model))) * aNormal;
Position = vec3(model * vec4(aPos, 1.0));
gl_Position = projection * view * model * vec4(aPos, 1.0);
}
在项目中使用后的效果
折射
glsl内置函数中有:
T refract(T I, T N, float eta)
返回入射矢量I关于法向量N的折射矢量,折射率为eta
故通过
void main()
{
float ratio = 1.00 / 1.52;//折射率
vec3 I = normalize(Position - cameraPos);//入射方向
vec3 R = refract(I, normalize(Normal), ratio);//折射方向
FragColor = vec4(texture(skybox, R).rgb, 1.0);
}
原理与应用同反射,这里就不演示了。
动态环境贴图
通过使用帧缓冲,我们能够为物体的6个不同角度创建出场景的纹理,并在每个渲染迭代中将它们储存到一个立方体贴图中。
虽然它看起来很棒,但它有一个很大的缺点:我们需要为使用环境贴图的物体渲染场景6次,这是对程序是非常大的性能开销。
练习
尝试在我们之前在模型加载小节中创建的模型加载器中引入反射贴图。你可以在这里找到升级后有反射贴图的纳米装模型。仍有几点要注意的:
Assimp在大多数格式中都不太喜欢反射贴图,所以我们需要欺骗一下它,将反射贴图储存为漫反射贴图。你可以在加载材质的时候将反射贴图的纹理类型设置为aiTextureType_AMBIENT。
我偷懒直接使用镜面光纹理图像来创建了反射贴图,所以反射贴图在模型的某些地方不能准确地映射:)。
由于模型加载器本身就已经在着色器中占用了3个纹理单元了,你需要将天空盒绑定到第4个纹理单元上,因为我们要从同一个着色器中对天空盒采样。
还没搞懂是个啥意思,弄了半天也没弄出来,靠评论区了!!!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容