1

我想将顶点法线显示为源自顶点并在与基于指定比例的距离的法线相同的方向上延伸的线。

我能看到的最简单的方法是计算 CPU 上模型空间中每个法线的起点和终点,使用模型视图矩阵的逆转置将每个法线转换为视图空间,并将它们绘制为显卡。

有一个更好的方法吗?我想将顶点位置和法线传递到着色器中,以便它可以计算线位置,但这似乎更复杂,我相信需要在着色器中添加一个分支。

4

2 回答 2

2

如果您需要可视化法线以进行测试,您可能需要将法线xyz坐标设置为gl_FragColor. 不是很直观,但是当您查看这些颜色时,会给出法线正确性的总体印象。

我们已经使用这种技术来检查将法线加载到 VBO 的正确性。

于 2012-10-25T11:47:50.723 回答
1

在 OpenGL ES 2.0 中,如果没有 CPU 内部的一点额外计算,这绝对是不可能的。您不能只渲染所有顶点并为每个顶点神奇地创建一条线。因此,即使基于法线计算顶点着色器内的顶点坐标,您仍然必须为网格的每个原始顶点放入一条线(因此有两个顶点)。因此,这至少需要对您的顶点数据进行一些重组。

您也是正确的,这将要求您以某种方式消除着色器内线的起始顶点和结束顶点之间的歧义。但是您不一定需要分支,只需将起始顶点的法线设置为全 0(假设在渲染线时不需要其他任何东西的法线,但线通常不会被点亮):

中央处理器:

for each original vertex:
    generate two line vertices with attributes of original vertex
    set normal attribute of first line vertex to 0-vector
...
render all lines using following shader

显卡:

attribute vec3 position;
attribute vec3 normal;
...
void main()
{
    ...
    vec3 modelPos = position + normal;
    gl_Position = projMat * modelviewMat * vec4(modelPos, 1.0);
}

但我不认为这真的会给你带来任何好处,因为你必须以某种方式告诉着色器两个线端点之间的差异,一旦你这样做,你需要为 CPU 上的每条线生成两个不同的顶点。一旦你这样做了,你就可以根据法线改变第二行顶点的坐标,而不是在着色器中进行计算。那个小小的 vec3-saxpy 应该不会花你太多钱。但也许着色器方法更快,试试吧。

在桌面 GL 3+ 中情况会有所不同,您可以在其中使用几何着色器。您只需将所有原始顶点渲染为点,并在几何着色器中为每个点生成一条线,根据该点的法线计算其坐标。那么实际上不需要任何类型的 CPU 计算。但不幸的是 ES 2 没有几何着色器(虽然不知道 ES 3)。

于 2012-10-25T09:55:10.677 回答