问题标签 [normals]

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

c++ - 具有恒定法线的 glDrawElements

我只是好奇你是否可以在单次调用 DrawElements 进行绘图时指定常量法线。我正在使用 VAO 和 VBO,所以这不是问题,因为我为所有顶点加载一次并只存储 VBO ID,但我可以释放显卡中的一些内存..

这是您需要将数据加载到图形中的方式:

当我指定一些 5x5x5 网格,然后使用索引来创建立方表面时,处理法线并没有太多帮助,使用一些常量会有所帮助:)

0 投票
1 回答
908 浏览

opengl - 圆柱法线

我正在开发一个 OpenGL 应用程序,它现在只绘制一个由几个小圆柱体组成的大管(有点像一个紧身的)。当我打开照明和法线时,我得到了一个恼人的效果,因为从某些角度,我在圆柱体的边界上看到了这些恼人的黑点:

单个圆柱体边界上的黑点

我相信这是气缸非常薄的副产品。基本上我在设置顶部/底部时将法线设置为(0,0,+/- 1),然后侧法线是(cos(toRadian(beta)),sin(toRadian(beta)),0)。

是否有可能在获得“更胖”的气缸的情况下消除这种影响?还是我定义法线的方式有问题?

谢谢

0 投票
1 回答
555 浏览

c++ - DX10 地形法线

我正在使用 perlin 噪声生成地形,然后使用以下方法计算法线:

然而,这导致网格线出现在网格方块之间。任何想法是什么问题?

例子: 例子

0 投票
1 回答
859 浏览

c# - 使用 OpenGL 法线进行矩阵转换

我正在使用 OpenGL 中的几何图形,现在正在使用照明。我注意到,如果我翻译我的几何图形,法线不会跟随,因此是无用的。

如何将变换矩阵应用于几何并保持法线?

目前我正在使用以下代码:

当我给几何图形一个偏移量时,它不能正确渲染(例如,法线没有正确映射。

任何帮助都会非常好。

ps,我使用的是 OpenTK 包装器,但常规的 OpenGL 直接转换。

编辑:

好的,如果我将上面的代码更改为以下内容:

一切都很好。

这是一些屏幕截图(根据他们的代码)

阴影不起作用 遮光工作

0 投票
2 回答
1978 浏览

opengl-es - 计算顶点法线时的小问题(OpenGL ES)

我对顶点法线有一点问题。

结果似乎有点奇怪。首先看一下图片:

3D 软件中的原始模型。

Per-Fragment 光照,直接从 OBJ 文件导入网格(使用文件中的法线)。

Per-Fragment 光照,用我自己的例程计算法线。

你注意到了吗?使用 OBJ 文件中的法线一切正常。但是,当我使用自己的例程根据顶点计算法线时,似乎有些不对劲。

当 Z 变为负时(使用右手方向),法线看起来很奇怪。在对象的其他部分,一切正常,但只有一条穿过网格的假想线看起来很奇怪。这个问题在其他网格上仍然存在,总是在同一个地方,Z = 0。

我计算法线的例程是每个人都知道的,假设一个顶点为 ABC 的三角形:

然后将正常结果添加到已经计算的正常缓冲区中。

我见过一些人说要计算每个三角形的面积并将其乘以法线,甚至检查缓冲区法线和新法线之间的点积,但我已经尝试过这些方法,但我抓住了变化不大,但仍然有同样的问题。

你以前见过这个吗?你知道怎么解决吗?

这是一些代码:

0 投票
2 回答
1756 浏览

opengl - 如何为 VBO 生成法线?

我已经为我的 OpenGL 应用程序实现了一个波前 (OBJ) 文件加载器,它为我提供了面部、纹理和顶点信息。但是,要使用照明,我显然需要正常信息。我知道这样做的正确方法是取构成三角形的 3 个顶点的叉积并归一化。这会导致您应用于所有 3 个顶点的法线对吗?

但是,对于不在多边形边缘的面/三角形,每个顶点使用 3 次。所以我猜你只是用之前计算的法线平均每个新计算的法线?

按照我的想法,这似乎是一项非常昂贵的任务;遍历所有顶点并计算使用该顶点的每个面的法线并进行平均。有没有更好/更快的方法来做到这一点?

干杯

克里斯

0 投票
2 回答
2149 浏览

opengl - 具有非标准投影矩阵的 GLSL 法线

在让我的 GLSL 顶点着色器正确显示顶点几天后,我现在开始使用光照!无论如何,我对openGL光照/法线的理解都不是很好,所以请耐心等待。我不确定我需要对我的法线应用哪些翻译才能让它们正确显示。这是设置我的灯的应用程序代码:

到目前为止相当标准的东西。现在由于应用程序的要求,这里是(有点奇怪的)顶点着色器:

我的理解是我需要将其转换gl_Normal为世界坐标。对于我的着色器,我相信这将是:

然后我需要获取灯光的位置(已在世界空间的应用程序代码中声明)。我想我会这样做:

然后通过求法线与光照位置的点积求出光照的漫反射值。

此外,我认为在片段着色器中,我只需要将颜色乘以这个漫反射值,它就可以工作了。我只是真的不确定如何正确转换法线坐标。我的假设是正确的还是我完全没有把握?

编辑: 在读到法线矩阵 ( gl_NormalMatrix) 只是矩阵的 3x3 逆gl_ModelView矩阵后,我猜想在世界空间中计算法线的正确方法是gl_Normal乘以modelTranslationMatrix * modelRotationMatrix * modelScaleMatrix? 我还需要将它乘以P矩阵还是与正常计算无关?

0 投票
2 回答
1752 浏览

opengl - 带有 GLSL 法线的奇怪效果

作为一个有点类似于我之前和之前发布的问题,我试图让法线在我的 GLSL 应用程序中正确显示。出于解释的目的,我使用 RenderMonkey 提供的 ninjaHead.obj 模型进行测试(您可以在此处获取)。现在在 RenderMonkey 的预览窗口中,一切看起来都很棒: 渲染猴子 分别生成的顶点和片段代码是:

顶点:

分段:

我的 GLSL 代码以此为基础,但我并没有得到预期的结果......

我的顶点着色器代码:

我的片段着色器代码:

但是我的渲染产生了这个...... openGL 渲染

有谁知道这可能是什么原因和/或如何使它工作?

编辑 响应 kvark 的评论,这里是渲染的模型,没有任何法线/光照计算来显示所有正在渲染的三角形。 渲染平面着色

这是带有用于颜色的法线的模型着色。相信问题已经找到了!现在的原因是为什么它被渲染成这样以及如何解决它?欢迎提出建议! 正常着色

解决方案 大家问题已经解决了!感谢 kvark 提供的所有有用的见解,这肯定有助于我的编程实践,但我担心答案来自我是一个巨大的山雀......我在设置 glNormalPointer 偏移量的代码的 display() 函数中有一个错误为随机值。以前是这样的:

但应该是这样的:

所以我想这是一个教训。永远不要盲目地使用 Ctrl+C 和 Ctrl+V 代码来节省周五下午的时间并且...当您确定您正在查看的代码部分是正确的时,问题可能出在其他地方!

0 投票
3 回答
23476 浏览

opengl - OpenGL中的法线是什么?

我听说我应该使用法线而不是颜色,因为不推荐使用颜色。(这是真的吗?)法线与光的反射有关,但我找不到清晰直观的解释。什么是正常?

0 投票
3 回答
496 浏览

c# - 平均像素位置以找到表面法线。(2D)

我正在 XNA 中开发需要一些物理特性的 2D 游戏。我发现像 Farseer 这样的物理引擎不会因为它们的某些工作方式而削减它。(这是一个很长的故事,涉及重写代码 3 次最终弄清楚我需要自己编写物理。)所以根据我使用的参考资料,我现在需要的唯一数据是表面的法线碰撞。

这是使用 sprite 使用逐像素碰撞检测。我目前有一个包含所有重叠像素及其位置的数组。我想使用该数据来计算重叠像素的位置的平均值,以找出该表面的法线。这应该允许我与不规则形状的物体发生碰撞,但仍保持真实的物理交互。

如果有人对我如何使用这个像素信息来计算表面法线或足够接近的东西有任何建议,那就太好了。

谢谢。