代码之家  ›  专栏  ›  技术社区  ›  Ionel Lupu

八顶点立方体的法向量

  •  3
  • Ionel Lupu  · 技术社区  · 10 年前

    我在玩WEBGL,今天遇到了一个立方体顶点法线的问题。

    我用立方体网格检查了代码 from internet 而且效果很好。

    事实是,来自互联网的立方体有24个顶点(每个面4个,6个面),我认为这对我的立方体来说非常重要。

    FIDDLE MY CUBE | FIDDLE INTERNET CUBE (我的代码在第200行开始)

    我发现一个立方体只需要8个顶点和12个索引。 但当我渲染立方体时,屏幕上会出现一个奇怪的形状(因为法线?): enter image description here

    这是与我的立方体几乎相同旋转位置的立方体形式互联网: enter image description here

    这是我的立方体:

    var cube = {
        "vertices" : [
            -0.5 , 0.5 , 0.5, // 0
             0.5 , 0.5 , 0.5, // 1
            -0.5 ,-0.5 , 0.5, // 2
             0.5 ,-0.5 , 0.5, // 3
    
            -0.5 , 0.5 , -0.5, // 4
             0.5 , 0.5 , -0.5, // 5
            -0.5 ,-0.5 , -0.5, // 6
             0.5 ,-0.5 , -0.5 // 7
        ],
        "normals" : [
            0.57    , 0.57      , -0.57 ,
            0.57    , -0.57     , -0.57 ,
            -0.57   , -0.57     , -0.57 ,
            -0.57   , 0.57      , -0.57 ,
            0.57    , 0.57      , 0.57 ,
            0.57    , -0.57     , 0.57 ,
            -0.57   , -0.57     , 0.57 ,
            -0.57   , 0.57      , 0.57 
        ],
        "indices" : [
            0 , 2 , 3 ,
            0 , 3 , 1 ,
    
            0 , 4 , 5 ,
            0 , 5 , 1 ,
    
            0 , 4 , 6 ,
            0 , 6 , 2 ,
    
            2 , 6 , 7 ,
            2 , 7 , 3 ,
    
            1 , 5 , 7 ,
            1 , 7 , 3 ,
    
            4 , 6 , 7 ,
            4 , 7 , 5 
        ]
    }
    

    我的问题是:

    是否可以为8顶点立方体创建正确的法线? 如果没有,有什么替代方案?

    2 回复  |  直到 10 年前
        1
  •  4
  •   kolenda    10 年前

    你需要明白 vertex 不仅仅是空间中的一个点,而是一组不同的财产,连接到一个对象中。这些财产包括位置,但也可能有法线、颜色、纹理坐标等。

    在3D图形中,通常需要将两个或多个顶点放置在同一位置,但具有不同的法线、颜色或纹理坐标。这就是立方体的情况-立方体通常只有8个角,但所有这些角都连接3条边,每条边都有不同的法线,所以这就是为什么你看到的所有示例立方体都有24个顶点的原因。

    事实上,立方体非常类似于球体,具有非常简单的几何结构,球体上的每个顶点都只有一条法线,并且顶点周围的照明是平滑的。在立方体中,需要将每一侧着色为平面,因此构建该一侧的所有顶点都需要相同的法线。

    如果将立方体视为6个不同的四边形,并创建所有具有独立顶点的四边形的话,可能更容易理解。

        2
  •  0
  •   frankelot    4 年前

    可以使用传递几何体着色器来解决此问题。

    几何体着色器接受一个形状并输出另一个形状(可以是相同类型)。在您的情况下,它应该只输出与输入相同的三角形。它还应计算正常值并将其发送给FS

    在此处查找VS、GS和FS的代码: https://community.khronos.org/t/calculate-normals-in-vertex-shader/71573/4

    有关几何着色器的详细信息,请查看此处的“可视化法线向量”: https://learnopengl.com/Advanced-OpenGL/Geometry-Shader