使用半球光照的例子
时间: 2023-07-11 16:09:41 浏览: 63
下面是一个使用半球光照的OpenGL的例子:
首先,我们需要加载半球体纹理。这里我们使用了一个预先生成的半球体纹理,它是一个立方体贴图,其中的每个面都是一个半球体的投影。我们可以使用stb_image库来加载纹理:
```c++
int width, height, nrComponents;
unsigned char *data = stbi_load("half_sphere_map.png", &width, &height, &nrComponents, 0);
unsigned int envCubemap;
glGenTextures(1, &envCubemap);
glBindTexture(GL_TEXTURE_CUBE_MAP, envCubemap);
for (unsigned int i = 0; i < 6; ++i)
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
stbi_image_free(data);
```
接下来,我们需要在着色器中实现半球光照。下面是一个使用GLSL实现半球光照的片段着色器:
```glsl
#version 330 core
out vec4 FragColor;
in vec3 FragPos;
in vec3 Normal;
uniform samplerCube envCubemap;
const float PI = 3.14159265359;
void main()
{
// 计算半球体的纹理坐标
vec3 N = normalize(Normal);
vec3 R = reflect(-FragPos, N);
vec3 up = vec3(0.0, 1.0, 0.0);
vec3 right = cross(up, N);
up = cross(N, right);
mat3 rotMat = mat3(right, up, N);
vec3 envMapCoord = rotMat * R;
// 采样半球体纹理
vec3 envColor = texture(envCubemap, envMapCoord).rgb;
// 输出最终颜色
FragColor = vec4(envColor, 1.0);
}
```
在这个着色器中,我们首先计算顶点的法向量,并将其归一化。然后,我们使用这个法向量计算半球体的纹理坐标,并采样半球体纹理。最后,我们将环境光颜色作为输出的最终颜色。
最后,我们需要将半球体纹理绑定到立方体贴图中,并将其传递给着色器:
```c++
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, envCubemap);
shader.setInt("envCubemap", 0);
```
这样就完成了半球光照的实现。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)