Opengl 镜面反射高光取决于摄影机距离
我只是尝试实现镜面反射高光。问题是,当远离曲面移动时,高光变得越来越强,高光的边缘变得非常粗糙。当移动到离曲面太近时,高光将完全消失 这是我的片段着色器的相关部分。所有计算都在视图空间中进行。我使用定向太阳光Opengl 镜面反射高光取决于摄影机距离,opengl,glsl,lighting,specular,phong,Opengl,Glsl,Lighting,Specular,Phong,我只是尝试实现镜面反射高光。问题是,当远离曲面移动时,高光变得越来越强,高光的边缘变得非常粗糙。当移动到离曲面太近时,高光将完全消失 这是我的片段着色器的相关部分。所有计算都在视图空间中进行。我使用定向太阳光 // samplers vec3 normal = texture2D(normals, coord).xyz; vec3 position = texture2D(positions, coord).xyz; float shininess = texture2D(spe
// samplers
vec3 normal = texture2D(normals, coord).xyz;
vec3 position = texture2D(positions, coord).xyz;
float shininess = texture2D(speculars, coord).x;
// normalize directional light source
vec3 source;
if(directional) source = position + normalize(light);
else source = light;
// reflection
float specular = 0;
vec3 lookat = vec3(0, 0, 1);
float reflection = max(0, dot(reflect(position, normal), lookat));
int power = 5;
specular = shininess * pow(reflection, power);
// ...
// output
image = color * attenuation * intensity * (fraction + specular);
这是我的照明缓冲区的屏幕截图。您可以看到,最前面的桶根本没有镜面反射高光,而远处的桶太亮了。中间的枪管按需要点亮。p>
我做错了什么?您是从对象位置计算反射向量,而不是使用反转的灯光方向(从对象指向光源) 这就像在这个图中用V代替L一样:
另外,我认为反光度应该是表达式的指数,而不是线性乘以镜面反射的贡献。您是从对象位置计算反射向量,而不是使用反转的灯光方向(从对象指向光源) 这就像在这个图中用V代替L一样:
另外,我认为反光度应该是表达式的指数,而不是线性乘以镜面反射的贡献。您是从对象位置计算反射向量,而不是使用反转的灯光方向(从对象指向光源) 这就像在这个图中用V代替L一样:
另外,我认为反光度应该是表达式的指数,而不是线性乘以镜面反射的贡献。您是从对象位置计算反射向量,而不是使用反转的灯光方向(从对象指向光源) 这就像在这个图中用V代替L一样:
此外,我认为反光度应该是表达式的指数,而不是镜面反射贡献的线性倍增。我认为变量命名让你感到困惑。 从我读到的(假设你在相机空间,没有用手知识)
lookat
是平行光,position
是实际的lookat
确保normal
(可能已经标准化)和position
(lookat
)已标准化
较不容易混淆的代码是:
vec3 light_direction = vec3(0, 0, 1);
vec3 lookat = normalize(position-vec3(0,0,0));
float reflection = max(0, dot(reflect(light_direction, normal), -lookat));
如果不规范化位置
,反射
将有偏差。当位置
远离摄像机vec3(0,0,0)
注意
lookat
不是一个常数;每个位置都会发生变化lookat=vec3(0,0,1)
正在查看视图空间中的单个位置。我认为变量命名让您感到困惑。
从我读到的(假设你在相机空间,没有用手知识)
lookat
是平行光,position
是实际的lookat
确保normal
(可能已经标准化)和position
(lookat
)已标准化
较不容易混淆的代码是:
vec3 light_direction = vec3(0, 0, 1);
vec3 lookat = normalize(position-vec3(0,0,0));
float reflection = max(0, dot(reflect(light_direction, normal), -lookat));
如果不规范化位置
,反射
将有偏差。当位置
远离摄像机vec3(0,0,0)
注意
lookat
不是一个常数;每个位置都会发生变化lookat=vec3(0,0,1)
正在查看视图空间中的单个位置。我认为变量命名让您感到困惑。
从我读到的(假设你在相机空间,没有用手知识)
lookat
是平行光,position
是实际的lookat
确保normal
(可能已经标准化)和position
(lookat
)已标准化
较不容易混淆的代码是:
vec3 light_direction = vec3(0, 0, 1);
vec3 lookat = normalize(position-vec3(0,0,0));
float reflection = max(0, dot(reflect(light_direction, normal), -lookat));
如果不规范化位置
,反射
将有偏差。当位置
远离摄像机vec3(0,0,0)
注意
lookat
不是一个常数;每个位置都会发生变化lookat=vec3(0,0,1)
正在查看视图空间中的单个位置。我认为变量命名让您感到困惑。
从我读到的(假设你在相机空间,没有用手知识)
lookat
是平行光,position
是实际的lookat
确保normal
(可能已经标准化)和position
(lookat
)已标准化
较不容易混淆的代码是:
vec3 light_direction = vec3(0, 0, 1);
vec3 lookat = normalize(position-vec3(0,0,0));
float reflection = max(0, dot(reflect(light_direction, normal), -lookat));
如果不规范化位置
,反射
将有偏差。当位置
远离摄像机vec3(0,0,0)
注意
lookat
不是一个常数;每个位置都会发生变化lookat=vec3(0,0,1)
正在查看视图空间中的单个位置。显示客户端代码,尤其是光向量。确保你不会混淆位置和方向。对于定向光源,我将位置视为方向。例如,太阳的位置为0.5、1.0、1.5
。这会造成问题吗?但是,方向灯和点光源的问题是相同的。代码不够。请展示如何构造模型视图矩阵。例如,如果查看向量为ls,如x、y、z、1,则可能会出现问题。您应该编辑问题并指定坐标系、查看器和灯光状态<代码>源,方向
,灯
<