如何正确组织立方体照明的法线?
立方体顶点:
std::vector<Vertex> vertices = { Vertex {Position: glm::vec3(-0.5, -0.5, -0.5)}, Vertex {Position: glm::vec3(-0.5, 0.5, -0.5)}, Vertex {Position: glm::vec3( 0.5, 0.5, -0.5)}, Vertex {Position: glm::vec3( 0.5, -0.5, -0.5)}, Vertex {Position: glm::vec3(-0.5, -0.5, 0.5)}, Vertex {Position: glm::vec3(-0.5, 0.5, 0.5)}, Vertex {Position: glm::vec3( 0.5, 0.5, 0.5)}, Vertex {Position: glm::vec3( 0.5, -0.5, 0.5)}};立方体索引:
std::vector<unsigned int> indices = { 0, 1, 2, 0, 2, 3, // front 4, 5, 6, 4, 6, 7, // back 0, 1, 5, 0, 5, 4, // left 2, 6, 3, 3, 6, 7, // right 1, 5, 2, 2, 5, 6, // up 9, 4, 3, 3, 4, 7 // bottom };立方体是使用 drawElements 方法绘制的。
如果我正确理解了理论......那么计算颜色,立方体的每个顶点应该有3个法线,如图所示。
但我不知道如何将 3 个法线传递给一个顶点的着色器?
并且如果仍然成功转移,如何确定当前人脸所需的法线?(因为我们每个顶点有 3 个法线)
你需要分割顶点
因为 对于立方体的每一侧,法线必须不同,并且它不能存储在除顶点属性之外的任何地方,您必须将立方体“拆分”为 4 个顶点(和 2 个三角形)的 6 个边。因此,您应该有 24 个具有相同位置和不同法线的顶点,以及 12 个使用它们的三角形。
在您的绘图中,所有内容都被正确描绘 - 为清楚起见,立方体的侧面略微分开。
PS 分割顶点是一种标准做法,对于“破碎”的 UV 和不同材料的连接点也需要。