实现Gouraud光照模型,求给定点的漫放射光强;
时间: 2024-05-15 19:15:33 浏览: 140
Gouraud光照模型是一种基于顶点着色器的光照模型,它考虑了顶点的法向量和光源的位置、颜色等因素来计算顶点的颜色。具体步骤如下:
1. 计算顶点的法向量。可以通过计算相邻三角形的法向量并进行平均来得到一个平滑的法向量。如果模型已经包含了法向量,则可以直接使用。
2. 计算每个顶点到光源的向量,并将其归一化。如果光源是方向光源,则可以将光源的方向作为向量。
3. 计算每个顶点到光源的距离。
4. 计算每个顶点的漫反射光强。漫反射光强由以下公式计算:
$diffuse = max(dot(N, L), 0) * lightColor$
其中,N为顶点的法向量,L为顶点到光源的向量,lightColor为光源的颜色。
5. 将每个顶点的漫反射光强插值得到给定点的漫反射光强。
实现代码如下:
```c++
// 计算顶点的漫反射光强
glm::vec3 calculateDiffuseLight(glm::vec3 vertexPos, glm::vec3 vertexNormal, glm::vec3 lightPos, glm::vec3 lightColor)
{
glm::vec3 lightDir = glm::normalize(lightPos - vertexPos);
float distance = glm::length(lightPos - vertexPos);
float diffuseFactor = glm::max(glm::dot(vertexNormal, lightDir), 0.0f);
glm::vec3 diffuseLight = diffuseFactor * lightColor / distance;
return diffuseLight;
}
// 插值计算给定点的漫反射光强
glm::vec3 interpolateDiffuseLight(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, glm::vec3 n1, glm::vec3 n2, glm::vec3 n3, glm::vec3 lightPos, glm::vec3 lightColor, glm::vec3 point)
{
glm::vec3 barycentricCoord = calculateBarycentricCoord(v1, v2, v3, point);
glm::vec3 diffuseLight = barycentricCoord.x * calculateDiffuseLight(v1, n1, lightPos, lightColor)
+ barycentricCoord.y * calculateDiffuseLight(v2, n2, lightPos, lightColor)
+ barycentricCoord.z * calculateDiffuseLight(v3, n3, lightPos, lightColor);
return diffuseLight;
}
```
阅读全文