gpt4 book ai didi

opengl - 镜面光出现在物体的面向眼睛和背面

转载 作者:行者123 更新时间:2023-12-04 18:43:11 24 4
gpt4 key购买 nike

我正在写一个 Phong 着色的小测试,我的头撞在砖墙上试图让镜面反射组件工作。它似乎工作正常,除了镜面光应用于对象的前部和后部。 (对象本身是透明的,面部在 CPU 端手动排序。)

请注意,漫反射组件运行良好(仅出现在面向光源的一侧)——我认为这似乎排除了法线到达片段着色器的问题。

据我了解,镜面反射分量与眼睛矢量和反射光矢量之间的角度的 cos 成正比。

为了让事情变得非常简单,我的测试代码尝试在世界空间中执行此操作。相机位置和光向量被硬编码(抱歉)为 (0,0,4)(-0.707, 0, -0.707)分别。因此,眼睛向量是 (0,0,4) - fragPosition .

由于模型矩阵只执行旋转,因此顶点着色器只是通过模型矩阵转换顶点法线。 ( 注意: 这不是一个好的做法,因为许多类型的变换不保持正态正交性。通常对于正态矩阵,you should use 模型矩阵左上角 3x3 的逆转置。)为简单起见,片段着色器在单个浮点颜色 channel 上运行,并跳过镜面反射指数(/使用指数为 1)。

顶点着色器:

#version 140

uniform mat4 mvpMtx;
uniform mat4 modelMtx;

in vec3 inVPos;
in vec3 inVNormal;

out vec3 normal_world;
out vec3 fragpos_world;

void main(void) {
gl_Position = mvpMtx * vec4(inVPos, 1.0);
normal_world = vec3(modelMtx * vec4(inVNormal, 0.0));
fragpos_world = vec3(modelMtx * vec4(inVPos, 1.0));
}

片段着色器:
#version 140

uniform float
uLightS,
uLightD,
uLightA;

uniform float uObjOpacity;

in vec3 normal_world, fragpos_world;
out vec4 fragOutColour;

void main(void) {

vec3 vN = normalize(normal_world);
vec3 vL = vec3(-0.707, 0, -0.707);

// Diffuse:
// refl in all directions is proportional to cos(angle between -light vector & normal)
// i.e. proportional to -l.n
float df = max(dot(-vL, vN), 0.0);

// Specular:
// refl toward eye is proportional to cos(angle between eye & reflected light vectors)
// i.e. proportional to r.e
vec3 vE = normalize(vec3(0, 0, 4) - fragpos_world);
vec3 vR = reflect(vL, vN);
float sf = max(dot(vR, vE), 0.0);

float col = uLightA + df*uLightD + sf*uLightS;

fragOutColour = vec4(col, col, col, uObjOpacity);

}

我在这里找不到错误;谁能解释为什么镜面反射分量出现在物体的背面以及面向光的一侧?

非常感谢。

最佳答案

由于 GLSL reflect,正面和背面的镜面反射贡献实际上是相同的。对正常的符号不敏感。来自 this reference :

reflect(I, N) = I - 2.0 * dot(N, I) * N

所以翻转 N 的符号会引入两个抵消的减号。一句话,什么 reflect做的是反转 I的分量的符号与 N 沿同一轴.这不取决于哪条路 N面临。

如果您想从背面移除镜面反射组件,我认为您需要明确检查您的 dot(vE,vN) .

关于opengl - 镜面光出现在物体的面向眼睛和背面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20008089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com