问题标签 [bump-mapping]

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 回答
385 浏览

opengl - .mtl 格式是否有允许镜面反射、法线或平行贴图的“标准”扩展?

阅读有关Wavefront OBJ 格式常用的MTL 材质格式时,我发现它不支持高光贴图、平行贴图、凹凸贴图等附加功能。

我想知道,是否有支持指定这些功能的这种格式的常用扩展或修改?如果没有,是否有更现代的与 OBJ 一起使用的 MTL 等价物?

编辑:看起来wiki文章已经过时了,一方面,它说

MTL 格式虽然仍然被广泛使用,但已经过时,不完全支持高光贴图和视差贴图等后期技术。

但稍后会展示如何制作高光贴图和凹凸贴图。

0 投票
3 回答
9086 浏览

unity3d - Unity3D,圆形盒子的边缘,立方体?

将立方体上的边缘变圆的常用方法是什么,例如示例中的矩形对象?

在此处输入图像描述 在此处输入图像描述

理想的结果看起来与这些图像非常相似。

(当然,您可以从字面上使用具有仔细圆角边缘和角落的网格,但要实现这一点需要很多 tris。)


请注意,当然对于NON着色器方法...

在此处输入图像描述

添加两个小的扁平盒子,然后在两侧之间简单地将新的法线设为中间,即 45 度:

在此处输入图像描述

那将被完美地绘制成圆形......

下面的 GDG 提供了一篇文章,有人断言这确实是最好的方法,如果不使用着色器方法的话。

我真的很想知道如何使用着色器来做到这一点。


注意 - 关于非着色器方法的非常详细的教程

http://catlikecoding.com/unity/tutorials/rounded-cube/

0 投票
0 回答
299 浏览

c++ - 世界空间法线与切线空间法线有什么区别?

想我会要求获得关于切线空间与世界空间法线之间的区别的详细解释。

如果可能的话,也请包括任何优点和缺点。

主要是随着我更深入地研究法线贴图而获得更深入的理解。

0 投票
1 回答
141 浏览

3d - Three.js中没有相机移动和没有移动光源的“虚拟”移动法线贴图

如何在 Three.js 中不移动相机且不移动光源的情况下移动法线贴图?

我有一个垂直于相机视图矢量的平面。该平面始终位于视图的中心。当我移动相机时,飞机会随着相机移动,光源也会移动。

光源位于相机后面并指向平面。该光源以及飞机与相机同步移动。

为了观察飞机地图上的变化,我可以移动相机或移动光源。在我的情况下,它们同时移动并且相对于彼此没有位移。

我需要像另一个虚拟相机运动这样的东西,它会在平面上的法线贴图上产生变化。

感谢您的关注。

0 投票
2 回答
5137 浏览

c++ - 平坦水面上的法线贴图会产生不正确的镜面高光

我有一个平坦的水面,上面附有 dudv 和法线贴图。dudv 贴图工作正常,法线贴图也正确附加(可视化法线贴图看起来应该如此)。镜面高光总是显示在错误的位置,就好像光的方向不正确一样。照明在没有法线贴图的情况下正常工作,所以我不相信它是光的方向,但可能是切线空间。因为我从一组静态向量计算切线空间,所以我很困惑哪里可能出错。

在顶点着色器中,我创建了 TBN 矩阵,用于创建发送到片段着色器的切线空间向量:

然后在片段着色器中,我从法线贴图中采样一个法线向量,并使用转换后的切线空间向量来计算镜面高光:

请注意,我在世界空间中进行照明。

在没有法线贴图的情况下,照明效果很好,但是一旦我将 TBN 矩阵引入方程,镜面高光在水面上的方向就不是正确的。

编辑

我添加了一个图像来查看它当前的外观以及镜面光应该在哪里。这可能会为问题增加一些额外的洞察力:

 截屏

编辑2

这是奇怪的事情。如果我手动将法线向量定义为vec3(0.0, 0.0, 1.0)(在切线空间中指向上方),我会得到完美的镜面高光(但没有映射变化),一旦我从法线贴图中获取法线,我会再次得到不正确的高光,所以我会说原因问题的关键在于正常情况。然而,我使用的法线贴图是您通常会看到的默认法线贴图,如下所示:

水的法线图

为什么一旦我从这个法线贴图(已经应该在切线空间中)获取法线,镜面高光就会分解?

0 投票
1 回答
425 浏览

svg - 带有漫射照明的 SVG 滤镜凹凸贴图溢出

我正在尝试使用图像的亮度到阿尔法转换在 SVG 中创建凹凸贴图效果,然后更改点光源在整个表面上的位置。

这是我创建的短小提琴, https://jsfiddle.net/5g2qncq8/6/

代码片段:

当您滚动图像时,点光源的位置会更新,并且随着指针远离图像,图像会变暗。我遇到的问题是,虽然房子实际上是多边形的,但当点光源消失时,我会看到一些额外的灰色矩形区域(在房子上方)。为什么会这样?

当灯光照在房子的顶部时,它显然会消失。有人可以建议摆脱这个灰色区域的方法吗?

我知道我可能会遗漏一些明显的东西。任何帮助或指针表示赞赏。干杯!

0 投票
1 回答
2611 浏览

c++ - 法线映射:与片段着色器相比,TBN 矩阵不同导致顶点着色器

我正在为教程和教学目的进行法线映射实现我想将 TBN 矩阵传递给片段着色器(来自顶点着色器),以便我可以将切线空间中的法线向量转换为世界空间以进行照明计算。法线贴图应用于 2D 平面,其法线指向正 z 方向。

但是,当我在平面的顶点着色器中计算 TBN 矩阵时(因此所有顶点的所有切线/双切线都相同),显示的法线完全关闭。如果我将切线/副切线和法线向量传递给片段着色器并在那里构造 TBN,它就可以正常工作,如下图所示(显示法线):

法线映射错误

这就是它变得奇怪的地方。因为平面是平的,所以 T、B 和 N 向量对于它的所有顶点都是相同的,因此每个片段的 TBN 矩阵也应该是相同的(因为片段插值不会改变任何东西)。顶点着色器中的 TBN 矩阵应该与片段着色器中的 TBN 矩阵完全相同,但视觉输出另有说明。

顶点着色器和片段着色器的源代码如下:

顶点:

分段

两个 TBN 矩阵明显不同。下面我编译了不同片段着色器输出的图像:

法线映射不同的输出

您可以看到 T、B 和 N 向量是正确的,片段着色器的tbn矩阵也是正确的,但是来自顶点着色器的 TBN 矩阵fs_in.TBN给出了完全虚假的值。

我完全不知道为什么它不起作用。我知道我可以简单地将 Tangent 和 Bitangent 向量传递给片段着色器,在那里计算并完成它,但我很好奇这不起作用的确切原因?

0 投票
3 回答
2872 浏览

c++ - 我的法线贴图有什么问题?我想这是我的切线

编辑:您可能想从“编辑 3”开始,因为我已经解决了很多问题

这是我应用于 icosphere 的普通立方体贴图的屏幕截图:

在此处输入图像描述

我的立方体贴图 icosphere 的切线是使用以下代码生成的。m_indices中的一个std::vector索引进入 中std::vector的顶点m_vertices

我的 VertexData 看起来像这样 BTW:

我知道 currenttcoords和很好positionnormal否则你不会看到上面的屏幕截图)。

然后我的顶点着色器看起来像这样:

最后我的片段着色器看起来像这样:

据我所知:

  1. 我的切线计算正确。
  2. 我的法线贴图对我来说就像一张法线贴图。
  3. 我正在将光线和视图方向更改为切线空间以匹配我的法线贴图。

结果什么都没有。即没有任何东西被绘制到屏幕上。根本不是纯色。所以就像后面的一切都是没有遮挡的。

如果我将查找丢弃到我的法线贴图中,而只使用切线矩阵光并查看,我会得到以下信息:

在此处输入图像描述

这上面有一个后处理镜头光晕,它产生了那些有趣的点点滴滴。我认为重要的是来自法线似乎有些准确的表面的压倒性眩光。

如果我只是通过切线矩阵变换光线,我会得到:

在此处输入图像描述

所有这些结合起来告诉我我不知道我哪里出错了。

我有一种暗示,这是我的切线一代,因为其他作品似乎遵循我读过的每个教程似乎都在说的话。切线是在考虑立方体贴图的 icosphere 的情况下生成的。因此,要从立方体贴图通常的 3D 坐标中确定<S,T>2D<U,V>坐标,我:

  1. 用最大值确定我所在的脸
  2. 使用https://www.opengl.org/registry/specs/ARB/texture_cube_map.txt中的代码来确定 S、T 坐标

这是我正在谈论的https://www.opengl.org/registry/specs/ARB/texture_cube_map.txt的摘录。

编辑 我不知道为什么我以前没有,但我已经在几何着色器中输出了法线、切线和双切线,以查看它们面对的方式。我使用了本教程

他们来了

黄色是面法线,绿色是顶点法线。我不确定为什么顶点法线看起来是错误的,它们不会影响任何其他照明,所以它可能只是我的几何着色器中的一个错误。

切线是红色的,副法线是蓝色的。这些看起来(很难说)它们是相互垂直的,这是正确的,但除了它们没有指向统一的方向。这就是我以前的斑驳模式。

我不知道如何解决这个问题。

编辑 2 我已经解决了显示法线等问题。现在已修复。

结果,我添加了一些阴影使其更清晰,每种​​颜色都是不同的立方体面。

在此处输入图像描述

我改变的另一件事是查找我的法线贴图。我忘记将范围调整回 -1 到 1(从 0 到 1)。

这不能解决我的问题。

令人困惑的部分是,当我尝试使用纹理中的法线时,我没有得到任何渲染。深度缓冲区中没有任何内容。我已经检查并再次检查了纹理是否可以从着色器访问(因此原始屏幕截图显示了应用于球体的纹理)。

因为即使我的切线和副法线都指向各个方向;我仍然希望展示一些东西,即使它是错误的。但即使是环境颜色也没有通过。(即使我独自一人也会发生这种情况。如果我只是忽略顶点法线并查找纹理。我会失去环境颜色)lightDir......viewdir

编辑 3:最后一个问题

通常情况下,部分问题与您认为错误的地方无关。我的问题是我用不同的纹理覆盖了我的法线贴图的绑定。

所以,有了它,我现在可以看到我的颜色通过了。用我漂亮的性感凹凸贴图。

但是,现在立方体贴图的接缝处出现了问题。我不确定是因为计算了切线还是因为我的法线贴图的生成方式。我的法线贴图是从每个面的高度图独立生成的。

这可以解释我认为的一些接缝影响,我将对其进行修改以对这些边缘上的相邻面进行采样,看看会发生什么。

我仍然认为正在生成的切线也会对这些接缝产生不利影响。我的想法是,它们将在接缝处指向相反的方向。

截屏: 法线贴图接缝

编辑 4 从 EDIT1 开始测试时,我为我的 icosphere 使用了一个非常低的多边形网格。所以我有最小的细分。

我想看看我的不太完美的法线贴图球体看起来有很多多边形。这立即暴露了这个问题:

该死的...

如果不清楚,从左边跑来写的是我的老朋友,接缝,但在接缝下面,看起来像是三角形边缘。

所以在上述所有之后,我想我又回到了我原来的不正确切线问题。

仍在寻求任何正在阅读本文的人的帮助。

编辑 4 嗯,这很快。这个网站http://www.geeks3d.com/20130122/normal-mapping-without-precomputed-tangent-space-vectors/给了我另一种创建切线的方法。虽然代码看起来有点类似于我在 CPU 上所做的,但它并没有导致那些随机定向的切线从 EDIT 3 中产生这些边缘。

我现在非常接近。我仍然有接缝,这种生成切线的另一种方法似乎增加了它们的“接缝度”

在此处输入图像描述

编辑 5 我现在尝试修改我的法线贴图生成。之前的代码是这样的:

cubeFacesHeight是s 中std::array的一个。或者,我的立方体贴图的六个面。脸上的颜色是灰度的,我不使用花车的原因并不重要。6 std::dequeglm::vec4

我现在将其更改为以下内容,警告,这既丑陋又长。

所以我现在有点“流血”到相邻的立方体表面,以在生成法线贴图的同时对那里的高度进行采样。这实际上增加了接缝的外观。

嗯嗯

但这种方式提出了它自己的问题。例如……“到底为什么影响会增加?” 你可以看到它现在是一种斜角效果。

所以,我很确定当“流血”到下一个时,我已经正确地匹配了我的立方体面。这让我回到了不正确的切线。

即使我完全混合了立方体面,它也不会产生斜角效果,它会是完全参差不齐的东西。例如,即使在完全平坦的部分上,即将法线贴图生成渗入下一张面,效果为零,我仍然看到一个巨大的斜面。

更该死

这让我觉得如果切线之前是正确的,那么法线贴图会“匹配”切线方向吗?我不知道。

快速编辑 我注意到我在原始地图生成期间有效地对我的面部边缘进行了两次采样。如果我删除这个双重采样并且只使用 0 作为附加值,我最终会看到同样的大接缝。我不确定这意味着什么...

另一个快速编辑 这张图片显示了我认为很有说服力的东西。 在此处输入图像描述

我可以在这里看到两个不同的面孔“指向”相反的方向。这是我的片段切线生成。

所以我回到我的切线是一个问题。

0 投票
2 回答
803 浏览

opengl - 如何从高度图创建对象空间法线贴图?

我可以通过对周围像素进行采样将现有的高度贴图转换为法线贴图,就像在这个问题中从高度贴图生成法线贴图?除了我在 CPU 上做。

我有一个球体,我想在对象空间中进行法线贴图。如何将上述法线贴图应用于我的球体顶点的法线?

0 投票
1 回答
1137 浏览

php - 尝试在 PHP 中生成 3D 凹凸图文本

我有一个网站,上面有很多原始图片,我希望人们访问该网站以查看原始图片,并且让搜索引擎只显示带有透明水印的图片。

以下是我所说的透明水印的示例。当然,除了我替换“测试!” 与公司名称。

凹凸图

这是我到目前为止创建的 PHP 代码:

$i2是我在其中添加文本的图像框的资源变量,用于$i1放置文本的大图像。$w$h表示文本图像框的宽度和高度。此代码能够在不显示背景框的情况下在图像顶部生成文本,但不会产生如上图所示的凹凸贴图效果。

谁能指导我需要使用哪些函数、数学或代码来创建凹凸贴图效果?

我觉得我的解决方案需要对一块像素进行特殊操作,但我不知道如何实现这种效果。

我还想坚持使用 PHP GD Image 库。