问题标签 [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.
opengl - 镜面高光随着相机的移动而移动
我正在 OpenGL 中实现镜面高光作为 phong 模型的一部分。目前,当我的相机移动时,高光会移动,而不是变得更亮或更暗,这显然不是预期的结果。我已经按照 learnopengl.com 上的教程进行操作
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 是三角形的顶点。
那么什么看起来更有可能呢?上述代码中可能存在更复杂的错误,或者只是缺少对反射向量的规范化。或者也许是别的什么?谢谢你的时间。
webgl - Angel Shreiner 书中对 Phong 着色 WebGL 公式的怀疑
在 Angel Shreiner 书籍“交互式计算机图形学”的第 8 张幻灯片中(此处提供幻灯片),计算光照的建议代码如下所示:
然而,这种方式不仅看起来不对,除非我删除pos
声明中的减号,而且即使我这样做了,照明也过于依赖于观看者的位置(某些部分是黑暗的,如果观看者移动到那里,它就会完全变亮)。如果我在声明中仅使用模型矩阵切换 modelViewMatrix,N
它看起来就像一个魅力。这是本书代码中的错误吗?这是什么数学原因?我想真正了解阴影是如何工作的,但是这本书并不总是很清楚。我想说查看器应该对计算照明的方式产生影响,而不是它在建议的代码中发生的不切实际的方式。
c++ - 为什么我的法线不会在顶点之间插值,从而产生平坦的阴影效果?
我的 Phong 着色算法遇到了一些问题。似乎法线关闭了,我总是得到一个平坦的阴影表面。
我正在实现延迟渲染,所以在我的几何传递中,我将顶点的位置和法线存储在纹理中。在光照过程中,我将法线输出为颜色以检查它们的“值”。
编辑 1我的 Gbuffer 使用两个纹理来存储位置和法线。两种纹理都使用 GL_RGB16F 格式。
编辑 5正如你在这张图片中看到的,
我没有得到优雅的颜色过渡。左边的头像是我的引擎的结果,右边你可以在 Blender 中看到相同的模型。在 Blender 中,法线(蓝色)看起来是正确的(没有重复等),但在我的引擎中,它们的行为就像一个面法线(每 4 个显示在同一方向上)。我正在使用 Assimp 加载模型,并
aiProcess_GenSmoothNormals
在导入它们时包含标志。
几何传递顶点着色器:
几何通道片段着色器:
编辑 4从 Assimp (aiMesh) 读取顶点值
我想找到解决这个烂摊子的办法。我知道法线是问题,但我不知道为什么。
编辑 2从球体的外观来看,这似乎是一个插值问题,因此上面的着色器代码。如果着色器是正确的,那么可能是导入器类导致了这个问题?
编辑 3我还实现了前向渲染版本并将法线显示为颜色,但我得到与延迟版本相同的结果。
c++ - 带有 phong 着色和光线追踪的工件
在我的光线追踪器上实现 phong 着色时,我目前正在试验不同的工件。
第一种情况发生在我以我认为正确的方式实现镜面光照计算时:将光源的贡献累积添加:
但是,如果我不积累贡献,通过
我明白了:
似乎更接近,但仍然有一些文物。
打印 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) 的组件似乎是正确的,因为在其他地方使用没有问题。
因此,我将不胜感激有关错误可能在哪里以及如何修复它的任何建议。
opengl - 在 glsl 顶点着色器中使用额外的统一 mat4 转换灯光?
我正在为我的场景使用场景图。它包含灯光和网格。网格具有局部变换,如果节点是网格节点的子节点,则其自身的局部变换与其父节点的变换组合在一起。
现在我正在尝试实现灯光。我将灯光的坐标(世界空间坐标)作为制服发送到我的着色器。
我必须转换这些光坐标吗?对我来说,必须使用特定于网格的变换来变换这些光坐标是没有意义的。
我是否需要向着色器发送另一个统一矩阵来以不同的方式变换灯光?
我的代码:
opengl - PBR 纹理和 Phong Shading 模型材质参数
我正在研究 Phong 着色模型,看起来材料具有以下属性:
- 环境、漫反射和镜面反射系数(显示它们如何对光的这些属性作出反应)
- 镜面反射分量的光泽度
现在,假设我想编写一个没有固定值的着色器,而是从 PBR 纹理中获取它们,我可以在 3D Studio Max 或 Maya 等 3D 图形软件中生成它们。这样的纹理集通常由以下组成:
- 颜色/反照率/漫反射贴图(我猜它会取代“漫反射”系数)
- 环境遮挡(我认为它将取代“环境”系数)
- 高度图(不知道着色器将如何使用它)
- 法线贴图(简单,它取代了该点的法线)
- 金属/镜面反射(我认为这些替换了“镜面反射”系数,不确定哪个工作流程最适合 phong 模型)
- 粗糙度贴图(也许它取代了“光泽度”?不确定)
我在这里没有正确理解什么?我可以首先做到这一点吗?我在 Wikipedia 上读到环境遮挡不是像 Phong Shading 这样的本地方法,这可能只是意味着必须使用某种全局方法计算地图(对我来说没有问题,因为我在 3D 软件中生成它),但这让我怀疑如果 Phong 模型实际上适合我正在尝试做的事情。
glsl - 使光独立于 Phong 模型中的视图
我正在尝试实现 Phong 着色模型,但我遇到了一些很奇怪的事情。当我改变观察位置时,看起来灯光表现不同,就好像它依赖于视图一样。就像,如果我靠近物体,我只会看到环境光的效果,而如果我远离它,我就会开始看到漫反射的贡献。
这些是我的着色器:
我究竟做错了什么?如何使灯光的行为独立于观察者的位置?
更新1:
在@Rabbid76 的回答之后,我通过添加这些行来编辑顶点着色器(以及传递单独的模型和视图矩阵,但为了简洁起见,我将省略它):
而且我还更新了 N 向量的计算,因为以前的方法似乎实际上不允许每个片段着色:
尽管如此,阴影似乎随着相机的旋转而移动。这可能与我猜的光乘以 viewMatrix 的事实有关?