# 【一步步学OpenGL 19】 -《镜面反射光》

2391人阅读 评论(1)

## 镜面反射光

### 背景

‘I’ 是入射光

‘N’ 是表面法线

‘R’ 反射光，和入射光’I’关于法线对称，但方向相反

‘V’ 是从入射光和反射光交点处（入射点）到观察者眼睛的向量，表示观察者视线

‘α’ 反射光’R’和观察者视线’V’的夹角

### 源代码详解

(lighting_technique.h:32)


class LightingTechnique : public Technique
{
public:
...
void SetEyeWorldPos(const Vector3f& EyeWorldPos);
void SetMatSpecularIntensity(float Intensity);
void SetMatSpecularPower(float Power);

private:
...
GLuint m_eyeWorldPosLocation;
GLuint m_matSpecularIntensityLocation;
GLuint m_matSpecularPowerLocation;
}


(lighting.vs:12)


out vec3 WorldPos0;

void main()
{
gl_Position = gWVP * vec4(Position, 1.0);
TexCoord0 = TexCoord;
Normal0 = (gWorld * vec4(Normal, 0.0)).xyz;
WorldPos0 = (gWorld * vec4(Position, 1.0)).xyz;
}



(lighting.fs:5)
in vec3 WorldPos0;
.
.
.
uniform vec3 gEyeWorldPos;
uniform float gMatSpecularIntensity;
uniform float gSpecularPower;

void main()
{
vec4 AmbientColor = vec4(gDirectionalLight.Color * gDirectionalLight.AmbientIntensity, 1.0f);
vec3 LightDirection = -gDirectionalLight.Direction;
vec3 Normal = normalize(Normal0);

float DiffuseFactor = dot(Normal, LightDirection);

vec4 DiffuseColor = vec4(0, 0, 0, 0);
vec4 SpecularColor = vec4(0, 0, 0, 0);

if (DiffuseFactor > 0) {
DiffuseColor = vec4(gDirectionalLight.Color, 1.0f) *
gDirectionalLight.DiffuseIntensity *
DiffuseFactor;

vec3 VertexToEye = normalize(gEyeWorldPos - WorldPos0);
vec3 LightReflect = normalize(reflect(gDirectionalLight.Direction, Normal));
float SpecularFactor = dot(VertexToEye, LightReflect);
if (SpecularFactor > 0) {
SpecularFactor = pow(SpecularFactor, gSpecularPower);
SpecularColor = vec4(gDirectionalLight.Color * gMatSpecularIntensity * SpecularFactor, 1.0f);
}
}

FragColor = texture2D(gSampler, TexCoord0.xy) * (AmbientColor + DiffuseColor + SpecularColor);
}


(tutorial19.cpp:134)


m_pEffect->SetEyeWorldPos(m_pGameCamera->GetPos());
m_pEffect->SetMatSpecularIntensity(1.0f);
m_pEffect->SetMatSpecularPower(32);


1
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：452621次
• 积分：4943
• 等级：
• 排名：第6680名
• 原创：91篇
• 转载：17篇
• 译文：30篇
• 评论：229条
关于我
人生苦短，道阻且艰；修行不易，且行且努力。

【专业兴趣】：
游戏开发，图形学，图像处理与计算机视觉，iOS平台

【专业技能】：
iOS，游戏开发

【个人主页】：信厚的独立博客
【个人项目】：个人项目
【GitHub】：jiangxh1992
【邮箱】：jiangxinhou艾特outlook点com
我的微博
时空隧道
博客专栏
 iOS沉思录 文章：49篇 阅读：84157
 一步步学OpenGL3.3+ 文章：30篇 阅读：122294
世界在看我>_<
把广告压下去