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: Triangles
、TriangleStrip
和 TriangleFan
,GeometryRenderer
是否总是需要一个 indexBuffer
是一个常见的问题,我来提出更详细的答案。
primitiveType: Triangles
的 GeometryRenderer
不一定需要索引数组(我不确定 Qt3D
的源代码).
您看不到三角形的原因是:您定义的顶点顺序错误!改变vertexBuffer
中顶点的顺序,使每三个连续的顶点在绕三角形逆时针时形成一个三角形。然后三角形法线将指向您。
或者,从相反的方向查看您的实体:您会看到两个三角形。
当使用巨大的缓冲区并且您出于 memory/efficiency 的原因不想重复大量顶点时,您肯定应该考虑使用 indexBuffer
.
我正在尝试使用 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: Triangles
、TriangleStrip
和 TriangleFan
,GeometryRenderer
是否总是需要一个 indexBuffer
是一个常见的问题,我来提出更详细的答案。
primitiveType: Triangles
的 GeometryRenderer
不一定需要索引数组(我不确定 Qt3D
的源代码).
您看不到三角形的原因是:您定义的顶点顺序错误!改变vertexBuffer
中顶点的顺序,使每三个连续的顶点在绕三角形逆时针时形成一个三角形。然后三角形法线将指向您。
或者,从相反的方向查看您的实体:您会看到两个三角形。
当使用巨大的缓冲区并且您出于 memory/efficiency 的原因不想重复大量顶点时,您肯定应该考虑使用 indexBuffer
.