Opengl es OBJ格式和平面与平滑着色

Opengl es OBJ格式和平面与平滑着色,opengl-es,blender,Opengl Es,Blender,我正在使用OpenGLES1.1,并致力于将Blender的OBJ导出转换为一些包含顶点数据的二进制文件。我实际上已经有了一个工作工具,但我正在努力改变一些事情,遇到了一个问题 即使使用平滑着色,似乎使用正确的法线(垂直于面平面)也可以实现面的平坦外观。启用平滑着色和适当的法线(只需通过在Blender中标记为锐边的边和应用的边分割修改器),我就可以获得平滑部分和锐边的效果 我想问两个问题 从平滑着色和法线使用的角度来看,OBJ文件中表示平滑着色或平面着色的“s1”或“s off”线是否完全不必

我正在使用OpenGLES1.1,并致力于将Blender的OBJ导出转换为一些包含顶点数据的二进制文件。我实际上已经有了一个工作工具,但我正在努力改变一些事情,遇到了一个问题

即使使用平滑着色,似乎使用正确的法线(垂直于面平面)也可以实现面的平坦外观。启用平滑着色和适当的法线(只需通过在Blender中标记为锐边的边和应用的边分割修改器),我就可以获得平滑部分和锐边的效果

我想问两个问题

  • 从平滑着色和法线使用的角度来看,OBJ文件中表示平滑着色或平面着色的“s1”或“s off”线是否完全不必要

  • 在OpenGL中实际设置为“平面着色”时,法线是否完全被忽略(或者只是假设所有法线都垂直于面)


  • 在使用逐顶点法线时,在“gl_平面”和“gl_平滑”之间更改模式似乎不会影响渲染。从我所能看出,你的问题是每张脸只有一个法线。对于平滑着色,每个面应该有三条法线,每个顶点一条,并且它们都应该不同。例如,如果圆柱体的法线投影在圆柱体内部,则所有法线都应与圆柱体的轴相交。如果模型具有平滑法线,则OBJ导出应导出逐顶点法线。听起来您可能正在指定每面法线。对于OpenGL ES中的渲染,不使用平滑组,仅使用法线

    要使顶点看起来平滑,其法线必须是相邻面法线的平均值(或类似值),但不垂直于面平面(除非是指其所有相邻面的平均平面)

    GL_FLAT意味着,面颜色不是在三角形上插值的,而是从单个三角形角(不知道是第一个还是最后一个)获取的。该颜色来自顶点颜色或顶点照明,因此实际上可以获得每面法线,但这不一定是面方向,而是角点的法线


    如果在OBJ文件中获得逐顶点法线,则不需要s部分。但是你可以用这些来计算顶点法线。s部分是平滑组,将被解释为32位位字段。因此,实际上有32个不同的平滑组,每个面可以是多个面的一部分。因此,“s 5”线之后的所有面都是平滑组1和3(第一位和第三位集)的一部分。当两个相邻面是同一平滑组的一部分时,它们之间的边是平滑的(顶点共享法线)。通过这种方式,您可以重建必要的逐顶点法线。

    OBJ规范中没有规定平滑组应解释为位掩码,但这样使用它们非常方便,因此我可以了解为什么游戏引擎会这样对待它们。@ideasman42-Hmm,也许我是从3DS格式得到的,因为他们肯定是这样使用的。当仅将它们作为平滑组ID时,您无法将一个面归入多个组。难道不应该将“s 5”线后的所有面都作为平滑组1和3的一部分吗?
    […]平滑组1和4
    ?@PinkTurtle否,设置了第一位和第三位,
    5=2^0+2^2
    =1+4
    ,我的意思是:
    平滑组1和4
    因为你不可能有两个平滑组的非幂-我们怎么会误解呢?:)即,第7位设置为
    2^7=128
    ,即平滑组128(
    s128
    )。这不对吗?