1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Input 2.0
import Qt3D.Extras 2.0
import QtQuick 2.2 as QQ2
Entity {
id: sceneRoot
Camera {
id: camera
projectionType: CameraLens.PerspectiveProjection
fieldOfView: 22.5
aspectRatio: 16/9
nearPlane : 0.1
farPlane : 1000.0
position: Qt.vector3d(9.5, 7.0, 45.0)
upVector: Qt.vector3d(0.0, 1.0, 0.0)
viewCenter: Qt.vector3d(9.5, 0.5, 0.0)
}
FirstPersonCameraController { camera: camera }
components: [
RenderSettings {
activeFrameGraph: ForwardRenderer {
clearColor: Qt.rgba(0, 0.5, 1, 1)
camera: camera
}
},
// Event Source will be set by the Qt3DQuickWindow
InputSettings { }
]
Material {
id: instancedPhongMaterial
effect: Effect {
techniques: [
Technique {
graphicsApiFilter {
api: GraphicsApiFilter.OpenGL
profile: GraphicsApiFilter.CoreProfile
minorVersion: 2
majorVersion: 3
}
filterKeys: FilterKey { name: "renderingStyle"; value: "forward" }
renderPasses: RenderPass {
shaderProgram: ShaderProgram {
vertexShaderCode: loadSource("qrc:/gl3/instanced.vert")
fragmentShaderCode: loadSource("qrc:/gl3/instanced.frag")
}
}
},
Technique {
graphicsApiFilter {
api: GraphicsApiFilter.RHI
profile: GraphicsApiFilter.NoProfile
minorVersion: 1
majorVersion: 0
}
filterKeys: FilterKey { name: "renderingStyle"; value: "forward" }
renderPasses: RenderPass {
shaderProgram: ShaderProgram {
vertexShaderCode: loadSource("qrc:/gl45/instanced.vert")
fragmentShaderCode: loadSource("qrc:/gl45/instanced.frag")
}
}
}
]
}
}
// Create a GeometryRenderer component that uses the standard CylinderGeometry to
// create the base vertex and index data buffers and attributes.
GeometryRenderer {
id: cylinderMeshInstanced
enabled: instanceCount != 0
geometry: CylinderGeometry {
rings: 50
slices: 30
radius: 0.3
length: 3.0
attributes: [ instanceDataAttribute ]
}
// Use our buffer created from C++ as per-instance position data to render
// many instances (copies) of the base cylinder geometry in a single OpenGL
// draw call where supported (OpenGL >=3.3 or OpenGL ES 3). On older versions
// of OpenGL the instancing is emulated on the CPU using multiple draw calls.
QQ2.SequentialAnimation {
running: true
loops: QQ2.Animation.Infinite
QQ2.NumberAnimation {
target: cylinderMeshInstanced
property: "instanceCount"
duration: 5000
from: 0
to: _instanceBuffer.instanceCount
}
QQ2.PauseAnimation {
duration: 3000
}
QQ2.NumberAnimation {
target: cylinderMeshInstanced
property: "instanceCount"
duration: 5000
from: _instanceBuffer.instanceCount
to: 0
}
QQ2.PauseAnimation {
duration: 3000
}
}
Attribute {
id: instanceDataAttribute
name: "pos"
attributeType: Attribute.VertexAttribute
vertexBaseType: Attribute.Float
vertexSize: 3
divisor: 1
buffer: _instanceBuffer
}
}
Entity {
id: torusEntity
components: [ cylinderMeshInstanced, instancedPhongMaterial ]
}
}
|