OpenGL 半球光照原理 及shader代码
时间: 2023-08-01 16:15:13 浏览: 161
OpenGL Shader实例分析(8)彩色光圈效果
OpenGL 半球光照原理是一种基于环境光照的光照模型,它使用半球体来模拟环境光照射到物体表面的效果。半球体通常被分成两个部分,一个上半球和一个下半球,上半球表示天空光照,下半球表示地面光照。在这种光照模型中,每个顶点都会计算其对应的法向量,然后使用法向量去采样半球体上的纹理,从而得到该点的环境光颜色。
下面是一个简单的OpenGL半球光照的Shader代码:
顶点着色器:
```
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
out vec3 vPos;
out vec3 vNormal;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = projection * view * model * vec4(aPos, 1.0);
vPos = vec3(model * vec4(aPos, 1.0));
vNormal = mat3(transpose(inverse(model))) * aNormal;
}
```
片段着色器:
```
#version 330 core
out vec4 FragColor;
in vec3 vPos;
in vec3 vNormal;
uniform vec3 lightColor;
uniform vec3 objectColor;
uniform vec3 lightPos;
uniform vec3 viewPos;
uniform samplerCube skybox;
void main()
{
vec3 ambient = 0.2 * lightColor;
vec3 norm = normalize(vNormal);
vec3 lightDir = normalize(lightPos - vPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
vec3 viewDir = normalize(viewPos - vPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32.0);
vec3 specular = spec * lightColor;
vec3 envColor = texture(skybox, normalize(vPos)).rgb;
vec3 color = vec3(0.0);
color += ambient * envColor;
color += diffuse * objectColor * envColor;
color += specular * envColor;
FragColor = vec4(color, 1.0);
}
```
在这个Shader中,我们使用了天空盒纹理来模拟环境光照。通过采样天空盒纹理,我们可以得到当前顶点的环境光颜色。然后我们计算漫反射光和镜面反射光的强度,最终得到该点的最终颜色。
阅读全文