1// Copyright (C) 2019 Klaralvdalens Datakonsult AB (KDAB).
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qshaderimage.h"
5#include "qshaderimage_p.h"
6#include <Qt3DRender/qabstracttexture.h>
7
8QT_BEGIN_NAMESPACE
9
10namespace Qt3DRender {
11
12QShaderImagePrivate::QShaderImagePrivate()
13 : Qt3DCore::QNodePrivate()
14 , m_texture(nullptr)
15 , m_mipLevel(0)
16 , m_layer(0)
17 , m_access(QShaderImage::ReadWrite)
18 , m_format(QShaderImage::Automatic)
19 , m_layered(false)
20{
21}
22
23QShaderImagePrivate::~QShaderImagePrivate()
24{
25}
26
27/*!
28 \qmltype ShaderImage
29 \instantiates Qt3DRender::QShaderImage
30 \inqmlmodule Qt3D.Render
31 \since 5.14
32 \brief Provides Image access to shader programs.
33
34 To make the content of textures available for read and write operations in
35 a shader, they need to exposed as ShaderImage. Textures can be composed of
36 several mip levels, layers and faces. Additionally declaring a ShaderImage
37 allows specifying which level, layer or face of the texture content we want
38 to access.
39
40 ShaderImage has to be assigned as a Parameter's value and reference a valid
41 Qt3D.Render.AbstractTexture to work properly.
42
43 If the referenced texture is a one-dimensional array, two-dimensional array,
44 three-dimensional, cube map, cube map array, or two-dimensional multisample
45 array texture, it is possible to bind either the entire texture level or a
46 single layer or face of the texture level. This can be controlled with the
47 \l layered property.
48
49 Support for ShaderImage is only supported with OpenGL 4 and partially with
50 OpenGL ES 3.1 and 3.2.
51
52 OpenGL 4 supports the following image types:
53 \table
54 \header
55 \li GLSL Type
56 \li OpenGL Type Enum
57 \li Texture Type
58 \row
59 \li image1D
60 \li GL_IMAGE_1D
61 \li Texture1D
62 \row
63 \li image2D
64 \li GL_IMAGE_2D
65 \li Texture2D
66 \row
67 \li image3D
68 \li GL_IMAGE_3D
69 \li Texture3D
70 \row
71 \li image2DRect
72 \li GL_IMAGE_2D_RECT
73 \li TextureRectangle
74 \row
75 \li imageCube
76 \li GL_IMAGE_CUBE
77 \li TextureCubeMap
78 \row
79 \li imageBuffer
80 \li GL_IMAGE_BUFFER
81 \li TextureBuffer
82 \row
83 \li image1DArray
84 \li GL_IMAGE_1D_ARRAY
85 \li Texture1DArray
86 \row
87 \li image2DArray
88 \li GL_IMAGE_2D_ARRAY
89 \li Texture2DArray
90 \row
91 \li imageCubeArray
92 \li GL_IMAGE_CUBE_MAP_ARRAY
93 \li TextureCubeMapArray
94 \row
95 \li image2DMS
96 \li GL_IMAGE_2D_MULTISAMPLE
97 \li Texture2DMultisample
98 \row
99 \li image2DMSArray
100 \li GL_IMAGE_2D_MULTISAMPLE_ARRAY
101 \li Texture2DMultisampleArray
102 \row
103 \li iimage1D
104 \li GL_INT_IMAGE_1D
105 \li Texture1D
106 \row
107 \li iimage2D
108 \li GL_INT_IMAGE_2D
109 \li Texture2D
110 \row
111 \li iimage3D
112 \li GL_INT_IMAGE_3D
113 \li Texture3D
114 \row
115 \li iimage2DRect
116 \li GL_INT_IMAGE_2D_RECT
117 \li TextureRectangle
118 \row
119 \li iimageCube
120 \li GL_INT_IMAGE_CUBE
121 \li TextureCubeMap
122 \row
123 \li iimageBuffer
124 \li GL_INT_IMAGE_BUFFER
125 \li TextureBuffer
126 \row
127 \li iimage1DArray
128 \li GL_INT_IMAGE_1D_ARRAY
129 \li Texture1DArray
130 \row
131 \li iimage2DArray
132 \li GL_INT_IMAGE_2D_ARRAY
133 \li Texture2DArray
134 \row
135 \li iimageCubeArray
136 \li GL_INT_IMAGE_CUBE_MAP_ARRAY
137 \li TextureCubeMapArray
138 \row
139 \li iimage2DMS
140 \li GL_INT_IMAGE_2D_MULTISAMPLE
141 \li Texture2DMultisample
142 \row
143 \li iimage2DMSArray
144 \li GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY
145 \li Texture2DMultisampleArray
146 \row
147 \li uimage1D
148 \li GL_UNSIGNED_INT_IMAGE_1D
149 \li Texture1D
150 \row
151 \li uimage2D
152 \li GL_UNSIGNED_INT_IMAGE_2D
153 \li Texture2D
154 \row
155 \li uimage3D
156 \li GL_UNSIGNED_INT_IMAGE_3D
157 \li Texture3D
158 \row
159 \li uimage2DRect
160 \li GL_UNSIGNED_INT_IMAGE_2D_RECT
161 \li TextureRectangle
162 \row
163 \li uimageCube
164 \li GL_UNSIGNED_INT_IMAGE_CUBE
165 \li TextureCubeMap
166 \row
167 \li uimageBuffer
168 \li GL_UNSIGNED_INT_IMAGE_BUFFER
169 \li TextureBuffer
170 \row
171 \li uimage1DArray
172 \li GL_UNSIGNED_INT_IMAGE_1D_ARRAY
173 \li Texture1DArray
174 \row
175 \li uimage2DArray
176 \li GL_UNSIGNED_INT_IMAGE_2D_ARRAY
177 \li Texture2DArray
178 \row
179 \li uimageCubeArray
180 \li GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY
181 \li TextureCubeMapArray
182 \row
183 \li uimage2DMS
184 \li GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE
185 \li Texture2DMultisample
186 \row
187 \li uimage2DMSArray
188 \li GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY
189 \li Texture2DMultisampleArray
190 \endtable
191
192 OpenGL ES 3.1 supports the following image types:
193 \table
194 \header
195 \li GLSL Type
196 \li OpenGL Type Enum
197 \li Texture Type
198 \row
199 \li image2D
200 \li GL_IMAGE_2D
201 \li Texture2D
202 \row
203 \li image3D
204 \li GL_IMAGE_3D
205 \li Texture3D
206 \row
207 \li imageCube
208 \li GL_IMAGE_CUBE
209 \li TextureCubeMap
210 \row
211 \li image2DArray
212 \li GL_IMAGE_2D_ARRAY
213 \li Texture2DArray
214 \row
215 \li iimage2D
216 \li GL_INT_IMAGE_2D
217 \li Texture2D
218 \row
219 \li iimage3D
220 \li GL_INT_IMAGE_3D
221 \li Texture3D
222 \row
223 \li iimageCube
224 \li GL_INT_IMAGE_CUBE
225 \li TextureCubeMap
226 \row
227 \li iimage2DArray
228 \li GL_INT_IMAGE_2D_ARRAY
229 \li Texture2DArray
230 \row
231 \li uimage2D
232 \li GL_UNSIGNED_INT_IMAGE_2D
233 \li Texture2D
234 \row
235 \li uimage3D
236 \li GL_UNSIGNED_INT_IMAGE_3D
237 \li Texture3D
238 \row
239 \li uimageCube
240 \li GL_UNSIGNED_INT_IMAGE_CUBE
241 \li TextureCubeMap
242 \row
243 \li uimage2DArray
244 \li GL_UNSIGNED_INT_IMAGE_2D_ARRAY
245 \li Texture2DArray
246 \endtable
247
248 OpenGL ES 3.2 supports all of the OpenGL ES 3.1 image types as well as the
249 following:
250 \table
251 \header
252 \li GLSL Type
253 \li OpenGL Type Enum
254 \li Texture Type
255 \row
256 \li imageBuffer
257 \li GL_IMAGE_BUFFER
258 \li TextureBuffer
259 \row
260 \li imageCubeArray
261 \li GL_IMAGE_CUBE_MAP_ARRAY
262 \li TextureCubeMapArray
263 \row
264 \li iimageBuffer
265 \li GL_IMAGE_BUFFER
266 \li TextureBuffer
267 \row
268 \li iimageCubeArray
269 \li GL_INT_IMAGE_CUBE_MAP_ARRAY
270 \li TextureCubeMapArray
271 \row
272 \li uimageBuffer
273 \li GL_UNSIGNED_INT_IMAGE_BUFFER
274 \li TextureBuffer
275 \row
276 \li uimageCubeArray
277 \li GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY
278 \li TextureCubeMapArray
279 \endtable
280
281 Expected use would look like:
282
283 \badcode
284
285 import Qt3D.Render 2.14
286
287 Entity {
288 ...
289 Texture2D {
290 id: tex2D
291 ...
292 }
293
294 Material {
295 parameters: Parameter {
296 name: "imageUniformName"
297 value: ShaderImage {
298 texture: tex2D
299 }
300 }
301 ...
302 }
303 ...
304 }
305 \endcode
306 */
307
308/*!
309 \qmlproperty int Qt3D.Render::ShaderImage::mipLevel
310
311 Holds which mipLevel out of the referenced texture should be used for the
312 ShaderImage.
313
314 The default value is 0.
315 */
316
317/*!
318 \qmlproperty int Qt3D.Render::ShaderImage::layer
319
320 Holds which layer out of the referenced texture should be used for the
321 ShaderImage. This property does nothing if \a layered is set to true or if
322 the reference texture's type isn't compatible with layers.
323
324 \note When the referenced texture is of type cube map or cube map array and
325 \a ĺayered is set to false, the face and layer are retrieved in the
326 following manner:
327 \badcode
328 cubeMapLayer = layer / 6
329 cubeMapFace = layer - (cubeMapLayer * 6)
330 \endcode
331
332 The default value is 0.
333 */
334
335/*!
336 * \qmlproperty bool Qt3D.Render::ShaderImage::layered
337
338 If set to true, if the referenced texture is a one-dimensional array,
339 two-dimensional array, three-dimensional, cube map, cube map array, or
340 two-dimensional multisample array texture, the entire level will be bound
341 for all layers. If set to false, only the single layer specified by the \a
342 layer property will be bound.
343
344 The default value is \c false.
345 */
346
347/*!
348 \qmlproperty enumeration Qt3D.Render::ShaderImage::access
349
350 Specifies the type of access we want to allow from our shader instances to
351 the image. If a shader tries to write or read from an image that has
352 incompatible access, the behavior is undefined.
353
354 \value ShaderImage.ReadOnly
355 Read-only access.
356 \value ShaderImage.WriteOnly
357 Write-only access.
358 \value ShaderImage.ReadWrite
359 Read-write access.
360
361 The default value is ShaderImage.ReadWrite.
362 */
363
364/*!
365 \qmlproperty enumeration Qt3D.Render::ShaderImage::format
366
367 Specifies the image format, which is essentially important when storing values
368 in the ShaderImage from a shader.
369
370 The format doesn't have to be the same as the referenced texture's format.
371 It however has to be compatible (matching in size but not necessarily by
372 class type). For instance a texture of format R32F (size 32bits, class
373 1x32) could be used with an image of format RGBA8I (size 32bits, class
374 4x8). Table 8.27 of the
375 \l{https://www.khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf}{OpenGL specifications}
376 shows the size and class for all supported image formats.
377
378 By default Qt3D will try to set the image format to match that of the
379 referenced texture.
380
381 The default value is ShaderImage.Automatic.
382 */
383
384/*!
385 \class Qt3DRender::QShaderImage
386 \inmodule Qt3DRender
387 \since 5.14
388 \brief Provides Image access to shader programs.
389
390 To make the content of textures available for read and write operations in
391 a shader, they need to exposed as QShaderImage. Textures can be composed of
392 several mip levels, layers and faces. Additionally declaring a QShaderImage
393 allows specifying which level, layer or face of the texture content we want
394 to access.
395
396 QShaderImage has to be assigned as a QParameter's value and reference a valid
397 Qt3DRender::QAbstractTexture to work properly.
398
399 If the referenced texture is a one-dimensional array, two-dimensional array,
400 three-dimensional, cube map, cube map array, or two-dimensional multisample
401 array texture, it is possible to bind either the entire texture level or a
402 single layer or face of the texture level. This can be controlled with the
403 \l layered property.
404
405 Support for QShaderImage is only supported with OpenGL 4 and partially with
406 OpenGL ES 3.1 and 3.2.
407
408 OpenGL 4 supports the following image types:
409 \table
410 \header
411 \li GLSL Type
412 \li OpenGL Type Enum
413 \li Texture Type
414 \row
415 \li image1D
416 \li GL_IMAGE_1D
417 \li QTexture1D
418 \row
419 \li image2D
420 \li GL_IMAGE_2D
421 \li QTexture2D
422 \row
423 \li image3D
424 \li GL_IMAGE_3D
425 \li QTexture3D
426 \row
427 \li image2DRect
428 \li GL_IMAGE_2D_RECT
429 \li QTextureRectangle
430 \row
431 \li imageCube
432 \li GL_IMAGE_CUBE
433 \li QTextureCubeMap
434 \row
435 \li imageBuffer
436 \li GL_IMAGE_BUFFER
437 \li QTextureBuffer
438 \row
439 \li image1DArray
440 \li GL_IMAGE_1D_ARRAY
441 \li QTexture1DArray
442 \row
443 \li image2DArray
444 \li GL_IMAGE_2D_ARRAY
445 \li QTexture2DArray
446 \row
447 \li imageCubeArray
448 \li GL_IMAGE_CUBE_MAP_ARRAY
449 \li QTextureCubeMapArray
450 \row
451 \li image2DMS
452 \li GL_IMAGE_2D_MULTISAMPLE
453 \li QTexture2DMultisample
454 \row
455 \li image2DMSArray
456 \li GL_IMAGE_2D_MULTISAMPLE_ARRAY
457 \li QTexture2DMultisampleArray
458 \row
459 \li iimage1D
460 \li GL_INT_IMAGE_1D
461 \li QTexture1D
462 \row
463 \li iimage2D
464 \li GL_INT_IMAGE_2D
465 \li QTexture2D
466 \row
467 \li iimage3D
468 \li GL_INT_IMAGE_3D
469 \li QTexture3D
470 \row
471 \li iimage2DRect
472 \li GL_INT_IMAGE_2D_RECT
473 \li QTextureRectangle
474 \row
475 \li iimageCube
476 \li GL_INT_IMAGE_CUBE
477 \li QTextureCubeMap
478 \row
479 \li iimageBuffer
480 \li GL_INT_IMAGE_BUFFER
481 \li QTextureBuffer
482 \row
483 \li iimage1DArray
484 \li GL_INT_IMAGE_1D_ARRAY
485 \li QTexture1DArray
486 \row
487 \li iimage2DArray
488 \li GL_INT_IMAGE_2D_ARRAY
489 \li QTexture2DArray
490 \row
491 \li iimageCubeArray
492 \li GL_INT_IMAGE_CUBE_MAP_ARRAY
493 \li QTextureCubeMapArray
494 \row
495 \li iimage2DMS
496 \li GL_INT_IMAGE_2D_MULTISAMPLE
497 \li QTexture2DMultisample
498 \row
499 \li iimage2DMSArray
500 \li GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY
501 \li QTexture2DMultisampleArray
502 \row
503 \li uimage1D
504 \li GL_UNSIGNED_INT_IMAGE_1D
505 \li QTexture1D
506 \row
507 \li uimage2D
508 \li GL_UNSIGNED_INT_IMAGE_2D
509 \li QTexture2D
510 \row
511 \li uimage3D
512 \li GL_UNSIGNED_INT_IMAGE_3D
513 \li QTexture3D
514 \row
515 \li uimage2DRect
516 \li GL_UNSIGNED_INT_IMAGE_2D_RECT
517 \li QTextureRectangle
518 \row
519 \li uimageCube
520 \li GL_UNSIGNED_INT_IMAGE_CUBE
521 \li QTextureCubeMap
522 \row
523 \li uimageBuffer
524 \li GL_UNSIGNED_INT_IMAGE_BUFFER
525 \li QTextureBuffer
526 \row
527 \li uimage1DArray
528 \li GL_UNSIGNED_INT_IMAGE_1D_ARRAY
529 \li QTexture1DArray
530 \row
531 \li uimage2DArray
532 \li GL_UNSIGNED_INT_IMAGE_2D_ARRAY
533 \li QTexture2DArray
534 \row
535 \li uimageCubeArray
536 \li GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY
537 \li QTextureCubeMapArray
538 \row
539 \li uimage2DMS
540 \li GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE
541 \li QTexture2DMultisample
542 \row
543 \li uimage2DMSArray
544 \li GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY
545 \li QTexture2DMultisampleArray
546 \endtable
547
548 OpenGL ES 3.1 supports the following image types:
549 \table
550 \header
551 \li GLSL Type
552 \li OpenGL Type Enum
553 \li Texture Type
554 \row
555 \li image2D
556 \li GL_IMAGE_2D
557 \li QTexture2D
558 \row
559 \li image3D
560 \li GL_IMAGE_3D
561 \li QTexture3D
562 \row
563 \li imageCube
564 \li GL_IMAGE_CUBE
565 \li QTextureCubeMap
566 \row
567 \li image2DArray
568 \li GL_IMAGE_2D_ARRAY
569 \li QTexture2DArray
570 \row
571 \li iimage2D
572 \li GL_INT_IMAGE_2D
573 \li QTexture2D
574 \row
575 \li iimage3D
576 \li GL_INT_IMAGE_3D
577 \li QTexture3D
578 \row
579 \li iimageCube
580 \li GL_INT_IMAGE_CUBE
581 \li QTextureCubeMap
582 \row
583 \li iimage2DArray
584 \li GL_INT_IMAGE_2D_ARRAY
585 \li QTexture2DArray
586 \row
587 \li uimage2D
588 \li GL_UNSIGNED_INT_IMAGE_2D
589 \li QTexture2D
590 \row
591 \li uimage3D
592 \li GL_UNSIGNED_INT_IMAGE_3D
593 \li QTexture3D
594 \row
595 \li uimageCube
596 \li GL_UNSIGNED_INT_IMAGE_CUBE
597 \li QTextureCubeMap
598 \row
599 \li uimage2DArray
600 \li GL_UNSIGNED_INT_IMAGE_2D_ARRAY
601 \li QTexture2DArray
602 \endtable
603
604 OpenGL ES 3.2 supports all of the OpenGL ES 3.1 image types as well as the
605 following:
606 \table
607 \header
608 \li GLSL Type
609 \li OpenGL Type Enum
610 \li Texture Type
611 \row
612 \li imageBuffer
613 \li GL_IMAGE_BUFFER
614 \li QTextureBuffer
615 \row
616 \li imageCubeArray
617 \li GL_IMAGE_CUBE_MAP_ARRAY
618 \li QTextureCubeMapArray
619 \row
620 \li iimageBuffer
621 \li GL_IMAGE_BUFFER
622 \li QTextureBuffer
623 \row
624 \li iimageCubeArray
625 \li GL_INT_IMAGE_CUBE_MAP_ARRAY
626 \li QTextureCubeMapArray
627 \row
628 \li uimageBuffer
629 \li GL_UNSIGNED_INT_IMAGE_BUFFER
630 \li QTextureBuffer
631 \row
632 \li uimageCubeArray
633 \li GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY
634 \li QTextureCubeMapArray
635 \endtable
636
637 Expected use would look like:
638
639 \badcode
640 Qt3DRender::QTexture2D *tex2D = new Qt3DRender::QTexture2D();
641 ...
642 Qt3DRender::QMaterial *material = new Qt3DRender::QMaterial();
643 ...
644 Qt3DRender::QParameter *imageParameter = new Qt3DRender::QParameter();
645 Qt3DRender::QShaderImage *shaderImage = new Qt3DRender::QShaderImage();
646
647 shaderImage->setTexture(tex2D);
648
649 imageParameter->setName("imageUniformName");
650 imageParameter->setValue(QVariant::fromValue(shaderImage));
651
652 material->addParameter(imageParamenter);
653 \endcode
654 */
655
656/*!
657 \property Qt3DRender::QShaderImage::mipLevel
658
659 Holds which mipLevel out of the referenced texture should be used for the
660 QShaderImage.
661
662 The default value is 0.
663*/
664
665/*!
666 \property Qt3DRender::QShaderImage::layer
667
668 Holds which layer out of the referenced texture should be used for the
669 QShaderImage. This property does nothing if \a layered is set to true or if the
670 reference texture's type isn't compatible with layers.
671
672 \note When the referenced texture is of type cube map or cube map array and
673 \a ĺayered is set to false, the face and layer are retrieved in the
674 following manner:
675 \badcode
676 cubeMapLayer = layer / 6
677 cubeMapFace = layer - (cubeMapLayer * 6)
678 \endcode
679
680 The default value is 0.
681 */
682
683/*!
684 * \property Qt3DRender::QShaderImage::layered
685
686 If set to true, if the referenced texture is a one-dimensional array,
687 two-dimensional array, three-dimensional, cube map, cube map array, or
688 two-dimensional multisample array texture, the entire level will be bound
689 for all layers. If set to false, only the single layer specified by the \a
690 layer property will be bound.
691
692 The default value is \c false.
693 */
694
695/*!
696 \property Qt3DRender::QShaderImage::access
697
698 Specifies the type of access we want to allow from our shader instances to
699 the image. If a shader tries to write or read from an image that has
700 incompatible access, the behavior is undefined.
701
702 The default value is QShaderImage::ReadWrite.
703 */
704
705/*!
706 \property Qt3DRender::QShaderImage::format
707
708 Specifies the image format, which is essentially important when storing values
709 in the Image from a shader.
710
711 The format doesn't have to be the same as the referenced texture's format.
712 It however has to be compatible (matching in size but not necessarily by
713 class type). For instance a texture of format R32F (size 32bits, class
714 1x32) could be used with an image of format RGBA8I (size 32bits, class
715 4x8). Table 8.27 of the
716 \l{https://www.khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf}{OpenGL specifications}
717 shows the size and class for all supported Image formats.
718
719 By default Qt3D will try to set the image format to match that of the
720 referenced texture.
721
722 The default value is QShaderImage::Automatic.
723 */
724
725/*!
726 \enum Qt3DRender::QShaderImage::Access
727
728 \value ReadOnly
729 Image will only be read from in shaders
730 \value WriteOnly
731 Image will only be written into from shaders
732 \value ReadWrite
733 Image will only be read and written into from shaders
734*/
735
736/*!
737 \enum Qt3DRender::QShaderImage::ImageFormat
738
739 This list describes all possible image formats
740
741 \value NoFormat
742 GL_NONE
743 \value Automatic
744 Qt 3D will try to determine the format automatically based on
745 the referenced texture.
746 \value R8_UNorm
747 GL_R8 (GLSL type r8, supported by OpenGL 4.2+)
748 \value RG8_UNorm
749 GL_RG8 (GLSL type rg8, supported by OpenGL 4.2+)
750 \value RGBA8_UNorm
751 GL_RGBA8 (GLSL type rgba8, supported by OpenGL 4.2+, OpenGL ES 3.1+)
752 \value R16_UNorm
753 GL_R16 (GLSL type r16, supported by OpenGL 4.2+)
754 \value RG16_UNorm
755 GL_RG16 (GLSL type rg16, supported by OpenGL 4.2+)
756 \value RGBA16_UNorm
757 GL_RGBA16 (GLSL type rgba16, supported by OpenGL 4.2+)
758 \value R8_SNorm
759 GL_R8_SNORM (GLSL type r8_snorm, supported by OpenGL 4.2+)
760 \value RG8_SNorm
761 GL_RG8_SNORM (GLSL type rg8_snorm, supported by OpenGL 4.2+)
762 \value RGBA8_SNorm
763 GL_RGBA8_SNORM (GLSL type rgba8_snorm, supported by OpenGL 4.2+, OpenGL ES 3.1+)
764 \value R16_SNorm
765 GL_R16_SNORM (GLSL type r16_snorm, supported by OpenGL 4.2+)
766 \value RG16_SNorm
767 GL_RG16_SNORM (GLSL type rg16_snorm, supported by OpenGL 4.2+)
768 \value RGBA16_SNorm
769 GL_RGBA16_SNORM (GLSL type rgba16_snorm, supported by OpenGL 4.2+)
770 \value R8U
771 GL_R8UI (GLSL type r8ui, supported by OpenGL 4.2+)
772 \value RG8U
773 GL_RG8UI (GLSL type rg8ui, supported by OpenGL 4.2+)
774 \value RGBA8U
775 GL_RGBA8UI (GLSL type rgba8ui, supported by OpenGL 4.2+, OpenGL ES 3.1+)
776 \value R16U
777 GL_R16UI (GLSL type r16ui, supported by OpenGL 4.2+)
778 \value RG16U
779 GL_RG16UI (GLSL type rg16ui, supported by OpenGL 4.2+)
780 \value RGBA16U
781 GL_RGBA16UI (GLSL type rgba16ui, supported by OpenGL 4.2+, OpenGL ES 3.1+)
782 \value R32U
783 GL_R32UI (GLSL type r32ui, supported by OpenGL 4.2+, OpenGL ES 3.1)
784 \value RG32U
785 GL_RG32UI (GLSL type rg32ui, supported by OpenGL 4.2+)
786 \value RGBA32U
787 GL_RGBA32UI (GLSL type rgba32ui, supported by OpenGL 4.2+, OpenGL ES 3.1+)
788 \value R8I
789 GL_R8I (GLSL type r8i, supported by OpenGL 4.2+)
790 \value RG8I
791 GL_RG8I (GLSL type rg8i, supported by OpenGL 4.2+)
792 \value RGBA8I
793 GL_RGBA8I (GLSL type rgba8i, supported by OpenGL 4.2+, OpenGL ES 3.1+)
794 \value R16I
795 GL_R16I (GLSL type r16i, supported by OpenGL 4.2+)
796 \value RG16I
797 GL_RG16I (GLSL type rg16i, supported by OpenGL 4.2+)
798 \value RGBA16I
799 GL_RGBA16I (GLSL type rgba16i, supported by OpenGL 4.2+, OpenGL ES 3.1)
800 \value R32I
801 GL_R32I (GLSL type r32i, supported by OpenGL 4.2+, OpenGL ES 3.1+)
802 \value RG32I
803 GL_RG32I (GLSL type rg32i, supported by OpenGL 4.2+)
804 \value RGBA32I
805 GL_RGBA32I (GLSL type rgba32i, supported by OpenGL 4.2+, OpenGL ES 3.1+)
806 \value R16F
807 GL_R16F (GLSL type r16f, supported by OpenGL 4.2+)
808 \value RG16F
809 GL_RG16F (GLSL type rg16f, supported by OpenGL 4.2+)
810 \value RGBA16F
811 GL_RGBA16F (GLSL type rgba16f, supported by OpenGL 4.2+, OpenGL ES 3.1+)
812 \value R32F
813 GL_R32F (GLSL type r32f, supported by OpenGL 4.2+, OpenGL ES 3.1+)
814 \value RG32F
815 GL_RG32F (GLSL type rg32f, supported by OpenGL 4.2+)
816 \value RGBA32F
817 GL_RGBA32F (GLSL type rgba32f, supported by OpenGL 4.2+, OpenGL ES 3.1+)
818 \value RG11B10F
819 GL_R11F_G11F_B10F (GLSL type r11f_g11f_b10f, supported by OpenGL 4.2+)
820 \value RGB10A2
821 GL_RGB10_A2 (GLSL type rgb10_a2, supported by OpenGL 4.2+)
822 \value RGB10A2U
823 GL_RGB10_A2UI (GLSL type rgb10_a2ui, supported by OpenGL 4.2+)
824*/
825
826
827QShaderImage::QShaderImage(Qt3DCore::QNode *parent)
828 : Qt3DCore::QNode(*new QShaderImagePrivate, parent)
829{
830}
831
832QShaderImage::~QShaderImage()
833{
834
835}
836
837QAbstractTexture *QShaderImage::texture() const
838{
839 Q_D(const QShaderImage);
840 return d->m_texture;
841}
842
843bool QShaderImage::layered() const
844{
845 Q_D(const QShaderImage);
846 return d->m_layered;
847}
848
849int QShaderImage::mipLevel() const
850{
851 Q_D(const QShaderImage);
852 return d->m_mipLevel;
853}
854
855int QShaderImage::layer() const
856{
857 Q_D(const QShaderImage);
858 return d->m_layer;
859}
860
861QShaderImage::Access QShaderImage::access() const
862{
863 Q_D(const QShaderImage);
864 return d->m_access;
865}
866
867QShaderImage::ImageFormat QShaderImage::format() const
868{
869 Q_D(const QShaderImage);
870 return d->m_format;
871}
872
873void QShaderImage::setTexture(QAbstractTexture *texture)
874{
875 Q_D(QShaderImage);
876 if (texture == d->m_texture)
877 return;
878
879 if (d->m_texture)
880 d->unregisterDestructionHelper(node: d->m_texture);
881
882 if (texture && !texture->parent())
883 texture->setParent(this);
884
885 d->m_texture = texture;
886
887 if (d->m_texture)
888 d->registerDestructionHelper(node: d->m_texture, func: &QShaderImage::setTexture, d->m_texture);
889
890 Q_EMIT textureChanged(texture);
891}
892
893void QShaderImage::setLayered(bool layered)
894{
895 Q_D(QShaderImage);
896 if (layered == d->m_layered)
897 return;
898 d->m_layered = layered;
899 Q_EMIT layeredChanged(layered);
900}
901
902void QShaderImage::setMipLevel(int mipLevel)
903{
904 Q_D(QShaderImage);
905 if (mipLevel == d->m_mipLevel)
906 return;
907 d->m_mipLevel = mipLevel;
908 Q_EMIT mipLevelChanged(mipLevel);
909}
910
911void QShaderImage::setLayer(int layer)
912{
913 Q_D(QShaderImage);
914 if (layer == d->m_layer)
915 return;
916 d->m_layer = layer;
917 Q_EMIT layerChanged(layer);
918}
919
920void QShaderImage::setAccess(QShaderImage::Access access)
921{
922 Q_D(QShaderImage);
923 if (access == d->m_access)
924 return;
925 d->m_access = access;
926 Q_EMIT accessChanged(access);
927}
928
929void QShaderImage::setFormat(QShaderImage::ImageFormat format)
930{
931 Q_D(QShaderImage);
932 if (format == d->m_format)
933 return;
934 d->m_format = format;
935 Q_EMIT formatChanged(format);
936}
937
938} // namespace Qt3DRender
939
940QT_END_NAMESPACE
941
942#include "moc_qshaderimage.cpp"
943

source code of qt3d/src/render/materialsystem/qshaderimage.cpp