Если я адаптирую ваш 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
.