GeometryRenderer 为啥渲染线,而不是三角形
Posted
技术标签:
【中文标题】GeometryRenderer 为啥渲染线,而不是三角形【英文标题】:GeometryRenderer Why render lines, but not TrianglesGeometryRenderer 为什么渲染线,而不是三角形 【发布时间】:2018-09-07 01:58:44 【问题描述】:我正在尝试使用 GeometryRenderer 在程序上生成 Cube。为什么当 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】:如果我按照以下方式调整您的 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。
编辑:
由于GeometryRenderer
是否总是需要primitiveType: Triangles
、TriangleStrip
和TriangleStrip
和TriangleFan
的indexBuffer
是一个常见问题,我会想出一个更详细的答案。
primitiveType: Triangles
中的GeometryRenderer
确实不一定需要索引数组(我检查了Qt3D
的源代码,因为我不确定)。
您看不到三角形的原因是:您以错误的顺序定义了顶点!更改vertexBuffer
中顶点的顺序,使每三个连续顶点在围绕三角形逆时针 时形成一个三角形。然后三角形法线将指向您。
或者,从相反的方向看你的实体:你会看到两个三角形。
当使用巨大的缓冲区并且出于内存/效率原因不想重复大量顶点时,您肯定应该考虑使用indexBuffer
。
【讨论】:
奇怪的是,我想,将注释作为组件添加到实体会将实体设置为节点的父节点。 AFAIK、GeometryRenderer 和 PhongMaterial 需要在实体内声明。这就是原始片段所缺少的。以上是关于GeometryRenderer 为啥渲染线,而不是三角形的主要内容,如果未能解决你的问题,请参考以下文章
为啥 iPad 不能渲染“离线”情节而 iPhone 可以?