GeometryRenderer 为什么渲染线,而不是三角形

GeometryRenderer Why render lines, but not Triangles

我正在尝试使用 GeometryRenderer 程序生成立方体。为什么当 GeometryRenderer.primitiveType 设置为 LineLoop、Lines 或 TriangleFan 时一切正常,但使用 Triangles 或 TrianglesStrip 时却什么都画不出来?

PhongMaterial { id: material; }

GeometryRenderer {
    id: renderer
    primitiveType: GeometryRenderer.LineLoop
    instanceCount: 1
    geometry: Geometry {
        attributes: [
            Attribute {
                name: defaultPositionAttributeName
                attributeType: Attribute.VertexAttribute
                vertexBaseType: Attribute.Float
                vertexSize: 3
                byteOffset: 0
                byteStride: 3 * 4
                count: 6
                buffer: Buffer {
                    type: Buffer.VertexBuffer
                    data: new Float32Array([
                                               // #1 triangle
                                               -0.9, -0.5, 0.0,
                                               -0.0, -0.5, 0.0,
                                               -0.45, 0.5, 0.0,
                                               // #2 triangle
                                               0.0, -0.5, 0.0,
                                               0.9, -0.5, 0.0,
                                               0.45, 0.5, 0.0,
                                           ])
                }
            }
        ]
    }
}

Entity {
    components: [
        renderer,
        material
    ]
}

如果我按照以下方式调整您的 QML,那么我可以看到两个三角形:

import QtQuick 2.2
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Extras 2.0

Entity {
    id: root
    PhongMaterial { id: material; diffuse: Qt.rgba(0.8, 0., 0., 1.0) }
    GeometryRenderer {
        id: renderer
        primitiveType: GeometryRenderer.Triangles
        instanceCount: 1
        geometry: Geometry {
            Attribute {
                name: defaultPositionAttributeName
                attributeType: Attribute.VertexAttribute
                vertexBaseType: Attribute.Float
                vertexSize: 3
                byteOffset: 0
                byteStride: 3 * 4
                count: 6
                buffer: Buffer {
                    type: Buffer.VertexBuffer
                    data: new Float32Array([
                                    // #1 triangle
                                    -0.9, -0.5, 0.0,
                                    -0.0, -0.5, 0.0,
                                    -0.45, 0.5, 0.0,
                                    // #2 triangle
                                    0.0, -0.5, 0.0,
                                    0.9, -0.5, 0.0,
                                    0.45, 0.5, 0.0,
                                ])
                }
            }
        }
    }
    components: [ renderer, material ]
}

我想错误与 GeometryRenderer 和 Entity 的错误层次结构有关。

要获得正确的照明,您还需要为 GeometryRenderer 提供 vertexNormals。

编辑:

因为对于 primitiveType: TrianglesTriangleStripTriangleFanGeometryRenderer 是否总是需要一个 indexBuffer 是一个常见的问题,我来提出更详细的答案。

primitiveType: TrianglesGeometryRenderer 不一定需要索引数组(我不确定 Qt3D 的源代码).

您看不到三角形的原因是:您定义的顶点顺序错误!改变vertexBuffer中顶点的顺序,使每三个连续的顶点在绕三角形逆时针时形成一个三角形。然后三角形法线将指向您。

或者,从相反的方向查看您的实体:您会看到两个三角形。

当使用巨大的缓冲区并且您出于 memory/efficiency 的原因不想重复大量顶点时,您肯定应该考虑使用 indexBuffer.