问题标签 [specular]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
162 浏览

c++ - Phong - 两侧的半向量镜面反射

实现 PhongModel 着色时。镜面反射项出现在几何体的两侧。使用半向量计算镜面反射项。

在前面的输出图像中,它似乎计算正确。光在相机后面,物体在相机前面。

[光……相机……物体]

但是当去另一边时,即使没有漫反射项,我仍然会得到一些镜面反射,我不确定我是否应该这样做。在下面的图片中,物体和灯光都在相机前面,灯光在物体后面。

[相机……物体……光]

我想也许镜面反射应该乘以符号(fLDotN)?但结果似乎并不好。一般是怎么处理的?

我的猜测是我是

光照均匀位置在相机空间中设置:

具有法线和半向量的结果图像: Phong Specular+Diffuse Results

顶点着色器

片段着色器

0 投票
1 回答
2919 浏览

opengl - 如何计算 PBR 中的镜面反射贡献?

我正在尝试在我们的项目中实现基于物理的渲染 (PBR)(我们为学术和学习目的启动了一个小型游戏引擎),但我无法理解基于材料的金属和粗糙度计算镜面反射和漫反射贡献的正确方法是什么.

我们不使用任何第三方库/引擎进行渲染,一切都是用 OpenGL 3.3 手写的。

现在我有这个(我将把完整的代码放在下面):

但我的印象是镜面反射术语必须以某种方式依赖于粗糙度。我正在考虑将其更改为:

但同样,我不确定。正确的方法是什么?有没有正确的方法,或者我应该只使用“反复试验”的方法,直到得到满意的结果?

这是完整的 GLSL 代码:

0 投票
1 回答
337 浏览

java - OpenGL ES 2.0 镜面光生成黑色边框

我一直在研究应用程序的光机制,并且让漫反射光(环境光和定向光)工作得很好,但是镜面光会产生一些奇怪的效果。好像它消除了它周围一条带中的漫射光。

这是镜面光的计算。

然后整体光照计算函数返回这个。

在 main() 函数中,我只是将它们相乘。

它们都是 vec4 值。

这是没有(1.)和有(2.)镜面光打开的屏幕截图:

一 二

编辑:问题已通过将 pow 函数放入 if 语句中得到解决。我基本上忘记了我必须检查点积是否> 0,而不是 pow 函数。这是更新的代码。

0 投票
1 回答
671 浏览

c++ - 如何在openGL中处理点球体的闪电(环境、漫反射、镜面反射)

初始情况

我想在 openGL 中可视化模拟数据。我的数据由粒子位置(x、y、z)组成,其中每个粒子都有一些属性(如密度、温度……),这些属性将用于着色。这些 (SPH) 粒子(10 万到数百万)组合在一起,实际上代表行星,以防您想知道。我想将这些粒子渲染为小的 3D 球体,并添加环境光、漫反射光和镜面光。

现状与问题

  1. 在我的情况下:我在哪个坐标系中进行闪电计算?哪种方式是通过管道传递各种组件的“最佳”方式?

我看到在视图空间中执行此操作很常见,这也非常直观。但是:不同片段位置的法线是在片段着色器中以剪辑空间坐标计算的(请参阅附加的片段着色器)。我真的可以将它们“返回”到视图空间中,以便在视图空间中为所有片段进行闪电计算吗?与在剪辑空间中进行比较有什么优势吗?

  1. 如果我为每个球体使用网格,那么在视图空间中获得法线会更容易,但我认为使用数百万个粒子会大大降低性能,所以最好使用球体相交,你同意吗?

PS:我不需要模型矩阵,因为所有粒子都已经到位。

  1. 我知道 gl_Position 变量会发生投影除法,这是否真的发生在从顶点传递到片段着色器的所有 vec4 上?如果不是,也许片段着色器中的计算会出错?

片段着色器在剪辑空间中计算法线和漫反射/镜面反射闪电:

  1. 现在这实际上“有点”有效,但我感觉球体的不面向光源的侧面也被照亮,这是不应该发生的。我怎样才能解决这个问题?

在此处输入图像描述

一些奇怪的效果:此时光源实际上位于左侧行星的后面(它只是在左上角稍微突出一点),仍然存在漫反射和镜面反射效果。这边其实应该挺黑的!=(

在此处输入图像描述

同样在这一刻,我在片段着色器中得到一些 glError: 1282 错误,我不知道它来自哪里,因为着色器程序实际编译并运行,有什么建议吗?:)

0 投票
2 回答
781 浏览

opengl - Phong 光照:单独添加镜面光照还是与环境和漫反射一起添加?

我正在尝试实现 Phong 照明。在一些教程中,镜面光照被添加到环境光照和漫反射光照中,然后总光照乘以纹理颜色。我还看到了一个教程,其中在添加环境光和漫反射光与纹理颜色相乘后,分别添加了镜面光照。

这是一个片段着色器,其中包含两个选项和屏幕截图。

  • 选项 1. 高光添加到环境和漫反射

    在此处输入图像描述

  • 选项 2. 单独添加高光。

    在此处输入图像描述

在这些截图中,shineDump 值为 32.0f,specularStrength 为 0.5f。

哪一个看起来正确?在我看来,与第一个选项相比,第二个选项看起来是正确的,但是很多教程都使用第一个选项中的公式。

0 投票
0 回答
123 浏览

opengl - 镜面高光随着相机的移动而移动

我正在 OpenGL 中实现镜面高光作为 phong 模型的一部分。目前,当我的相机移动时,高光会移动,而不是变得更亮或更暗,这显然不是预期的结果。我已经按照 learnopengl.com 上的教程进行操作

0 投票
1 回答
289 浏览

three.js - Blender 2.8 到 ThreeJS GLTF 高光

我在 Blender 2.8 (和 2.79 )中有一个模型,飞机上有草纹理。这是一个领域。无论我将金属度和粗糙度设置为什么,在 ThreeJS 中查看时,根据太阳位置从特定角度查看时,场上总是会出现发白的光泽。

我认为将镜面反射颜色设置为黑色会消除这种光泽,但我猜这目前是不可能的,因为 ThreeJS StandardMaterial 不控制镜面反射颜色..

那么,基本上,有没有办法控制 ThreeJS StandardMaterial 上的镜面反射颜色?

0 投票
0 回答
145 浏览

java - 如何在光线追踪中为物体颜色添加镜面闪电和反射颜色?

作为初学者的学习体验,我一直在尝试用 Java 编写一个非常简单的光线追踪器。到目前为止,我可以渲染环境和朗伯着色,并且我一直在尝试添加镜面高光和反射,但没有成功。

我检查过的每个网站都提到了环境 + 漫反射 + 镜面反射方程,但我不明白如何为每个像素添加某个镜面反射值到 R、G 和 B 是假设添加白色高光。

我也很难弄清楚如何将反射颜色和对象颜色与阴影混合。

这是渲染图

编辑:经过一些调整,这里是新的结果

我的引擎类代码如下所示:

0 投票
0 回答
12 浏览

specular - 使用变量时像素着色器的行为很奇怪

我的问题是,当我从点光源计算和添加镜面光时,如果我在像素着色器中硬编码一个数字就可以了,但是如果该数字来自一个变量(它是指数),那么结果是块状的,阴影和光线之间非常鲜明的对比。

这是我的像素着色器代码:

0 投票
1 回答
196 浏览

graphics - 了解 Oren-Nayar 反射模型

在 Oren-Nayar 反射率模型中,假设每个面的反射率都是朗伯的。维基

我的理解 :

反射定律告诉我们,入射角等于反射角。所以在一个完美光滑的表面上,我们得到镜面反射。在粗糙的表面上,入射光束在多个方向上散射(每条光线都遵循反射定律)。为了对此建模,使用定义表面上的凹槽(小平面)的微平面模型。现在朗伯刻面是什么意思?我们是否在已经存在的凹槽上假设凹槽?