Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 镜面反射高光取决于摄影机距离_Opengl_Glsl_Lighting_Specular_Phong - Fatal编程技术网

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,则可能会出现问题。您应该编辑问题并指定坐标系、查看器和灯光状态<代码>源,
方向
<