Opengl es 使用OpenGL ES 2.0绘制顶点法线

Opengl es 使用OpenGL ES 2.0绘制顶点法线,opengl-es,opengl-es-2.0,vertex,Opengl Es,Opengl Es 2.0,Vertex,我希望将顶点法线显示为从顶点开始的直线,并在基于指定比例的距离内沿与法线相同的方向延伸 我能看到的最简单的方法是在CPU上计算模型空间中每个法线的起点和终点,使用模型视图矩阵的逆转置将每个法线转换为视图空间,并在GPU上绘制为线 有更好的方法吗?我曾想过将顶点位置和法线传递到着色器中,以便它可以计算线位置,但这似乎更复杂,我相信需要着色器中的分支。在OpenGL ES 2.0中,如果CPU中没有一点额外的计算,这肯定是不可能的。不能只渲染所有顶点,然后神奇地为每个顶点创建一条线。因此,即使基于法

我希望将顶点法线显示为从顶点开始的直线,并在基于指定比例的距离内沿与法线相同的方向延伸

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


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

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

同样正确的是,这将要求您以某种方式在着色器内直线的起始顶点和结束顶点之间取消燃烧。但不一定需要分支,只需将起始顶点的法线设置为所有0(假设渲染直线时不需要法线,但直线通常不会点亮):

中央处理器:

GPU:

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


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

如果需要为测试目的可视化法线,可能需要将法线xyz坐标设置为
gl\u FragColor
。不是很直观,但当你看到这些颜色时,会给人一种法线正确性的总体印象


我们已使用此技术检查将法线加载到VBOs的正确性。

感谢您的帮助!当然,您是对的,并且不可能在ES 2的着色器中生成几何体,因此必须将顶点传递到线着色器。我认为可以预先计算两个顶点在模型空间中的位置,将它们放在静态VBO中,并让线着色器使它们与模型顶点进行相同的变换。就像你只是在扩展模型。如果是这样,那就太好了是的。。这似乎奏效了。我希望这能解决问题。谢谢大家的帮助!谢谢keaukraine。。你的技术很方便,但在这种情况下,我知道法线是正确的。我真的只是在玩弄环境来处理事情。澄清一下,他的意思是将gl_FragColor设置为正常的xyz值:例如
gl_FragColor=vec4(正常,1.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);
}