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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
// Copyright (C) 2019 Klaralvdalens Datakonsult AB (KDAB).
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import Qt3D.Core 2.14
import Qt3D.Render 2.14
import Qt3D.Input 2.0
import Qt3D.Extras 2.0
Entity {
id: sceneRoot
components: [
RenderSettings {
id : external_forward_renderer
activeFrameGraph : RenderSurfaceSelector {
Viewport {
// Launch Compute Shader Instances
DispatchCompute {
}
// Draw Textures
CameraSelector {
camera: camera
ClearBuffers { buffers: ClearBuffers.ColorDepthBuffer
// Ensure we won't be reading from textures if Compute Shader instances aren't completed
MemoryBarrier { waitFor: MemoryBarrier.ShaderImageAccess|MemoryBarrier.TextureFetch }
}
}
}
}
},
// Event Source will be set by the Qt3DQuickWindow
InputSettings { id: inputSettings }
]
Camera {
id: camera
projectionType: CameraLens.PerspectiveProjection
fieldOfView: 45
aspectRatio: 16/9
nearPlane : 0.1
farPlane : 1000.0
position: Qt.vector3d( 0.0, 0.0, 3.0 )
upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
}
Texture2D {
id: inputTexture
width: 512
height: 512
format: Texture.RGBA8_UNorm
generateMipMaps: false
magnificationFilter: Texture.Linear
minificationFilter: Texture.Linear
wrapMode {
x: WrapMode.ClampToEdge
y: WrapMode.ClampToEdge
}
// Texture image which are referencing regular image extensions (jpg, png)
// are loaded through a QImage based texture image generator which generates
// RGBA8_UNorm based content
TextureImage {
source: "qrc:/image_512x512.jpg"
mirrored: false
}
}
Texture2D {
id: outputTexture
width: 512
height: 512
format: Texture.RGBA8_UNorm
generateMipMaps: false
magnificationFilter: Texture.Linear
minificationFilter: Texture.Linear
wrapMode {
x: WrapMode.ClampToEdge
y: WrapMode.ClampToEdge
}
}
// Compute -> Generate Output Texture Content
Entity {
readonly property Material material: Material {
parameters: [
Parameter {
name: "inputImage"
value: ShaderImage {
texture: inputTexture
layer: 0 // default
layered: false // default
mipLevel: 0 // default
access: ShaderImage.ReadOnly // default is ReadWrite
format: ShaderImage.Automatic // default
}
},
Parameter {
name: "outputImage"
value: ShaderImage {
texture: outputTexture
access: ShaderImage.WriteOnly // default is ReadWrite
format: ShaderImage.RGBA8_UNorm
}
}
]
effect: Effect {
techniques: Technique {
graphicsApiFilter {
api: GraphicsApiFilter.OpenGL
profile: GraphicsApiFilter.CoreProfile
majorVersion: 4
minorVersion: 3
}
renderPasses: RenderPass {
shaderProgram: ShaderProgram {
computeShaderCode:
"#version 430
layout(local_size_x = 16, local_size_y = 16) in;
layout(rgba8) readonly uniform image2D inputImage;
layout(rgba8) writeonly uniform image2D outputImage;
uniform float time;
void main(void) {
ivec2 imageCoords = ivec2(gl_GlobalInvocationID.xy);
// Early return if we are past the image's bounds
if (any(greaterThan(imageCoords, imageSize(inputImage))))
return;
// Read from input image
vec4 inputContent = imageLoad(inputImage, imageCoords);
// Store inputContent into output Image
imageStore(outputImage, imageCoords, inputContent * abs(sin(time)));
}"
}
}
}
}
}
readonly property ComputeCommand command: ComputeCommand {
readonly property int localWorkGroupSize: 16
workGroupX: Math.ceil(inputTexture.width / localWorkGroupSize)
workGroupY: Math.ceil(inputTexture.height / localWorkGroupSize)
}
components: [command, material]
}
// Preview Texture Scene
Entity {
PlaneMesh {
id: planeMesh
}
components: Transform {
rotationX: 90
}
Entity {
id: inputTexturePreview
readonly property Material material: TextureMaterial {
texture: inputTexture
}
readonly property Transform transform: Transform {
translation: Qt.vector3d(-1, 0, 0)
}
components: [planeMesh, material, transform]
}
Entity {
id: outputTexturePreview
readonly property Material material: TextureMaterial {
texture: outputTexture
}
readonly property Transform transform: Transform {
translation: Qt.vector3d(1, 0, 0)
}
components: [planeMesh, material, transform]
}
}
}
|