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: TrianglesTriangleStripTriangleStripTriangleFanindexBuffer 是一个常见问题,我会想出一个更详细的答案。

primitiveType: Triangles 中的GeometryRenderer 确实不一定需要索引数组(我检查了Qt3D 的源代码,因为我不确定)。

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

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

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

【讨论】:

奇怪的是,我想,将注释作为组件添加到实体会将实体设置为节点的父节点。 AFAIK、GeometryRenderer 和 PhongMaterial 需要在实体内声明。这就是原始片段所缺少的。

以上是关于GeometryRenderer 为啥渲染线,而不是三角形的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 vue 组件不重新渲染?

为啥 iPad 不能渲染“离线”情节而 iPhone 可以?

为啥在 Web 视图中渲染组件会变慢? [关闭]

请问为啥我的3D在渲染时没有出现渲染面板

请问vegas为啥会无法渲染?以前渲染都成功的,这次就一直报错,根据网上的方法找不到对应的编码模

MAYA如何渲染线稿效果