问题标签 [phong]

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 投票
0 回答
123 浏览

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

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

0 投票
1 回答
549 浏览

c++ - 带有 phong 着色和光线追踪溢出的“镜面”颜色

我在光线追踪器上实现了 phong 着色。不幸的是,我在运行它时收到了分段错误。可能的原因与“specular_color”Vec3f 变量有关(其中是由三个浮点数组成的对象)。当我打印它的值时,我收到:

specular_color: inf inf inf

找出原因并不复杂:

它是这样计算的:

其中 mat.ns 是镜面反射指数,它展示了预期值。

reflect*camera_dir 是原因,因为它总是以一个很大的值结束。在我的四个测试用例中,有三个是一个五位数的值。另一个是六位数的值(接近七)。因此,任何不接近 1 的指数的五位或六位数值都可能会溢出浮点变量。

现在的问题是为什么这些价值如此之大,如果它们可以或不能那样。如果他们不能,那么之前的代码中可能存在错误。如果可以的话,所缺少的只是对反射向量进行归一化(camera_dir 已经是单一的)

反射矢量是这样计算的:

其中 light_ray_dir 计算为:

current 是光源的名称,intersection 是光线与三角形的交点。

当它只漫射光时,它总是工作得很好。

然而,hit_normal 是新代码,计算方式如下:

u 和 v 是重心坐标,vertX 是三角形的顶点。

那么什么看起来更有可能呢?上述代码中可能存在更复杂的错误,或者只是缺少对反射向量的规范化。或者也许是别的什么?谢谢你的时间。

0 投票
0 回答
58 浏览

webgl - Angel Shreiner 书中对 Phong 着色 WebGL 公式的怀疑

在 Angel Shreiner 书籍“交互式计算机图形学”的第 8 张幻灯片中(此处提供幻灯片),计算光照的建议代码如下所示:

然而,这种方式不仅看起来不对,除非我删除pos声明中的减号,而且即使我这样做了,照明也过于依赖于观看者的位置(某些部分是黑暗的,如果观看者移动到那里,它就会完全变亮)。如果我在声明中仅使用模型矩阵切换 modelViewMatrix,N它看起来就像一个魅力。这是本书代码中的错误吗?这是什么数学原因?我想真正了解阴影是如何工作的,但是这本书并不总是很清楚。我想说查看器应该对计算照明的方式产生影响,而不是它在建议的代码中发生的不切实际的方式。

0 投票
2 回答
531 浏览

c++ - 为什么我的法线不会在顶点之间插值,从而产生平坦的阴影效果?

我的 Phong 着色算法遇到了一些问题。似乎法线关闭了,我总是得到一个平坦的阴影表面。

我正在实现延迟渲染,所以在我的几何传递中,我将顶点的位置和法线存储在纹理中。在光照过程中,我将法线输出为颜色以检查它们的“值”。
编辑 1我的 Gbuffer 使用两个纹理来存储位置和法线。两种纹理都使用 GL_RGB16F 格式。

编辑 5正如你在这张图片中看到的, 在此处输入图像描述 我没有得到优雅的颜色过渡。左边的头像是我的引擎的结果,右边你可以在 Blender 中看到相同的模型。在 Blender 中,法线(蓝色)看起来是正确的(没有重复等),但在我的引擎中,它们的行为就像一个面法线(每 4 个显示在同一方向上)。我正在使用 Assimp 加载模型,并aiProcess_GenSmoothNormals在导入它们时包含标志。

几何传递顶点着色器:

几何通道片段着色器:

编辑 4从 Assimp (aiMesh) 读取顶点值

我想找到解决这个烂摊子的办法。我知道法线是问题,但我不知道为什么。
编辑 2从球体的外观来看,这似乎是一个插值问题,因此上面的着色器代码。如果着色器是正确的,那么可能是导入器类导致了这个问题?
编辑 3我还实现了前向渲染版本并将法线显示为颜色,但我得到与延迟版本相同的结果。

0 投票
2 回答
571 浏览

c++ - 带有 phong 着色和光线追踪的工件

在我的光线追踪器上实现 phong 着色时,我目前正在试验不同的工件。

第一种情况发生在我以我认为正确的方式实现镜面光照计算时:将光源的贡献累积添加:

茶壶溢出

但是,如果我不积累贡献,通过

我明白了:

茶壶-sem-verflow

似乎更接近,但仍然有一些文物。

打印 specular_color 变量假定的一些值(即 3 个浮点对象)我收到的值高达

specular_color (200) 之后:1534.73 1534.73 1534.73

对于 x 和 y=200 的像素,添加了 + 符号

没有它,我会收到:

specular_color (200) 之后:0 0 0

所有这些浮点值都用

用于文件写入

而 final_value 无非是:

specular_color (light_intensity,reflected,camera_dir) 的组件似乎是正确的,因为在其他地方使用没有问题。

因此,我将不胜感激有关错误可能在哪里以及如何修复它的任何建议。

0 投票
0 回答
110 浏览

opengl - 在 glsl 顶点着色器中使用额外的统一 mat4 转换灯光?

我正在为我的场景使用场景图。它包含灯光和网格。网格具有局部变换,如果节点是网格节点的子节点,则其自身的局部变换与其父节点的变换组合在一起。

现在我正在尝试实现灯光。我将灯光的坐标(世界空间坐标)作为制服发送到我的着色器。

我必须转换这些光坐标吗?对我来说,必须使用特定于网格的变换来变换这些光坐标是没有意义的。

我是否需要向着色器发送另一个统一矩阵来以不同的方式变换灯光?

我的代码:

0 投票
0 回答
1334 浏览

opengl - PBR 纹理和 Phong Shading 模型材质参数

我正在研究 Phong 着色模型,看起来材料具有以下属性:

  • 环境、漫反射和镜面反射系数(显示它们如何对光的这些属性作出反应)
  • 镜面反射分量的光泽度

现在,假设我想编写一个没有固定值的着色器,而是从 PBR 纹理中获取它们,我可以在 3D Studio Max 或 Maya 等 3D 图形软件中生成它们。这样的纹理集通常由以下组成:

  • 颜色/反照率/漫反射贴图(我猜它会取代“漫反射”系数)
  • 环境遮挡(我认为它将取代“环境”系数)
  • 高度图(不知道着色器将如何使用它)
  • 法线贴图(简单,它取代了该点的法线)
  • 金属/镜面反射(我认为这些替换了“镜面反射”系数,不确定哪个工作流程最适合 phong 模型)
  • 粗糙度贴图(也许它取代了“光泽度”?不确定)

我在这里没有正确理解什么?我可以首先做到这一点吗?我在 Wikipedia 上读到环境遮挡不是像 Phong Shading 这样的本地方法,这可能只是意味着必须使用某种全局方法计算地图(对我来说没有问题,因为我在 3D 软件中生成它),但这让我怀疑如果 Phong 模型实际上适合我正在尝试做的事情。

0 投票
2 回答
125 浏览

glsl - 使光独立于 Phong 模型中的视图

我正在尝试实现 Phong 着色模型,但我遇到了一些很奇怪的事情。当我改变观察位置时,看起来灯光表现不同,就好像它依赖于视图一样。就像,如果我靠近物体,我只会看到环境光的效果,而如果我远离它,我就会开始看到漫反射的贡献。

这些是我的着色器:

我究竟做错了什么?如何使灯光的行为独立于观察者的位置?

更新1:

在@Rabbid76 的回答之后,我通过添加这些行来编辑顶点着色器(以及传递单独的模型和视图矩阵,但为了简洁起见,我将省略它):

而且我还更新了 N 向量的计算,因为以前的方法似乎实际上不允许每个片段着色:

尽管如此,阴影似乎随着相机的旋转而移动。这可能与我猜的光乘以 viewMatrix 的事实有关?

0 投票
0 回答
363 浏览

c++ - 使用 Phong 照明模型进行光线追踪:通过降低光强度似乎可以解决照明中的奇怪颜色?

我正在使用 Phong 照明模型编写一个带有照明的简单光线追踪器。但问题是有一部分球体显示完全不同的颜色。例如,球体在this中应该只有绿色。

这个

我试图降低光强度,然后它以某种方式正确显示为这样

像这样

这是主射线的代码

这是交集的代码(在原点用球体进行测试,没有任何转换)

并计算 Phong 照明

0 投票
1 回答
207 浏览

opengl - 正态分布函数中潜在活跃微面的浓度

我正在尝试了解 Cook-Torrance Microfacet 模型,并且目前停留在正态分布函数D(Beckmann、Blinn-Phong 或 GGX)上。一些在线资源声称D是与表面法线N对齐的微面法线M的分数,而 D 是介于 [0,1] 之间的分数。1 , 2

然而,经过一些研究,我了解到 D 是MN对齐的浓度。3 , 4

这个浓度值(经过一些测试可以达到 32 甚至更高)对我来说有点不祥。

从这样一个未归一化的值中究竟能读到什么?

它可以与对齐的MN的分数有关吗?

还是我忽略了一些简单的事情?