GeometryRenderer Зачем рендерить линии, а не треугольники - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь процедурно сгенерировать куб с помощью 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
    ]
}

1 Ответ

0 голосов
/ 07 сентября 2018

Если я адаптирую ваш 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 также вершинные нормальные значения.

Edit:

Поскольку это обычный вопрос, всегда ли GeometryRenderer всегда нужны indexBuffer для primitiveType: Triangles, TriangleStrip и TriangleFan, я придумаю несколько более подробный ответ.

A GeometryRenderer из primitiveType: Triangles не не обязательно нужен индексный массив (я проверил исходный код Qt3D, так как не был уверен).

Причина, по которой вы не видите свои треугольники: вы определяете вершины в неправильном порядке! Измените порядок вершин в vertexBuffer так, чтобы каждые три последовательные вершины образовывали треугольник при движении против часовой стрелки вокруг треугольника. Тогда нормальный треугольник укажет на вас.

Или взгляните на свою сущность с противоположной стороны: вы увидите два треугольника.

При использовании огромных буферов, и вы не хотите повторять большое количество вершин по соображениям памяти / эффективности, вам определенно следует рассмотреть возможность использования indexBuffer.

...