Opengl 计算立方体上的法线:顶点还是着色器?

Opengl 计算立方体上的法线:顶点还是着色器?,opengl,shader,ogre,Opengl,Shader,Ogre,我有一个关于OpenGL中法线的理论问题。我在任何地方都找不到一个清楚的解释(我在这方面的知识不到位) 我想在立方体上放置纹理,每个面一个,最明显的方法是使用法线 但在顶点中包含法线会导致不共享这些顶点: 在具有共享顶点的立方体上,我们将有8个顶点 在具有非共享顶点的立方体上,我们将有8*3=32个顶点 我在某个地方读过,着色器可以用来确定法线和应用纹理,但我对着色器一无所知,我想知道做这项工作的最佳方法是什么(在立方体的面上应用纹理) 除此之外,我希望这些顶点不共享应用于它们的纹理坐标(例

我有一个关于OpenGL中法线的理论问题。我在任何地方都找不到一个清楚的解释(我在这方面的知识不到位)

我想在立方体上放置纹理,每个面一个,最明显的方法是使用法线

但在顶点中包含法线会导致不共享这些顶点:

  • 在具有共享顶点的立方体上,我们将有8个顶点
  • 在具有非共享顶点的立方体上,我们将有8*3=32个顶点
我在某个地方读过,着色器可以用来确定法线和应用纹理,但我对着色器一无所知,我想知道做这项工作的最佳方法是什么(在立方体的面上应用纹理)

除此之外,我希望这些顶点不共享应用于它们的纹理坐标(例如,我们前面左下角的顶点将具有立方体正面纹理的(0,0)UV坐标,立方体左侧纹理的(0,1)UV坐标,以及(1,1)立方体底面纹理的UV坐标)。 在修补纹理时,着色器能否完成此工作


总之,将非共享纹理和非共享UV坐标应用于vertice的最佳方法是什么:使用非共享顶点(更多的顶点),还是使用着色器(我想GPU需要更多的工作)

我认为这取决于您的用例。考虑以下事项:

  • 必须渲染多少个顶点?如果只有少数,节省网格存储空间不是很重要
  • 顶点从CPU传输到GPU的频率是多少?如果每帧都需要,保存顶点可能会加快渲染时间
  • 你们大多数人的边缘都不光滑吗?如果大多数边看起来都是平滑的,则只能在少数需要的情况下断开网格

对于我所有的爱好项目,我都使用非共享顶点,因为它通常更容易处理。只有在程序中显示为瓶颈时,我才会关心性能。

最常用的方法是使用不同属性重复顶点,但也可以在geom着色器中计算法线(增加gpu的工作量)并使用绘制的每个面的原始索引来分配正确的纹理。如果只有单独的纹理组合作为输入,则可以在fbo中构建包裹纹理组合。关于顶点的数量,这已经是一个很好的数量(300000~),并且将此数乘以3对我来说似乎是个坏主意。关于顶点转移的频率,我真的不知道,因为我正在使用Ogre3D,但我将尝试收集有关此主题的一些信息:)非常感谢您的回复。