Qt3DRender::QShaderImage Class

class Qt3DRender::QShaderImage

提供对着色器程序的图像访问。更多

头文件: #include <QShaderImage>
CMake: find_package(Qt6 REQUIRED COMPONENTS 3drender)
target_link_libraries(mytarget PRIVATE Qt6::3drender)
qmake: QT += 3drender
在 QML 中: ShaderImage
继承: Qt3DCore::QNode
状态:已废弃

公共类型

enum Access { ReadOnly, WriteOnly, ReadWrite }
enum ImageFormat { NoFormat, Automatic, R8_UNorm, RG8_UNorm, RGBA8_UNorm, …, RGB10A2U }

属性

公共功能

Qt3DRender::QShaderImage::Access access() const
Qt3DRender::QShaderImage::ImageFormat format() const
int layer() const
bool layered() const
int mipLevel() const
Qt3DRender::QAbstractTexture *texture() const

公共插槽

void setAccess(Qt3DRender::QShaderImage::Access access)
void setFormat(Qt3DRender::QShaderImage::ImageFormat format)
void setLayer(int layer)
void setLayered(bool layered)
void setMipLevel(int mipLevel)
void setTexture(Qt3DRender::QAbstractTexture *texture)

信号

void accessChanged(Qt3DRender::QShaderImage::Access access)
void formatChanged(Qt3DRender::QShaderImage::ImageFormat format)
void layerChanged(int layer)
void layeredChanged(bool layered)
void mipLevelChanged(int mipLevel)
void textureChanged(Qt3DRender::QAbstractTexture *texture)

详细说明

为了在着色器中读写纹理内容,需要将纹理作为 QShaderImage 暴露。纹理可以由多个 mip 层、层和面组成。此外,声明 QShaderImage 还可以指定我们要访问纹理内容的哪个层、图层或面。

QShaderImage 必须指定为QParameter 的值,并引用一个有效的Qt3DRender::QAbstractTexture 才能正常工作。

如果引用的纹理是一维数组、二维数组、三维数组、立方体贴图、立方体贴图数组或二维多采样数组纹理,则可以绑定整个纹理层或纹理层的单层或单面。这可以通过layered 属性进行控制。

QShaderImage 仅支持 OpenGL 4,部分支持 OpenGL ES 3.1 和 3.2。

OpenGL 4 支持以下图像类型:

GLSL 类型OpenGL 类型枚举纹理类型
图像 1DGL_IMAGE_1DQTexture1D
图像2DGL_IMAGE_2DQTexture2D
图像 3DGL_IMAGE_3DQTexture3D
image2DRectgl_image_2d_rectQTextureRectangle
图像立方体图像立方体QTextureCubeMap
图像缓冲区gl_image_bufferQTextureBuffer
image1DArraygl_image_1d_arrayQTexture1DArray
图像 2DArraygl_image_2d_arrayQTexture2DArray
图像立方数组gl_image_cube_map_arrayQTextureCubeMapArray
图像2DMSgl_image_2d_multisampleQTexture2DMultisample
图像 2DMSArraygl_image_2d_multisample_arrayQTexture2DMultisampleArray
iimage1Dgl_int_image_1dQTexture1D
iimage2Dgl_int_image_2dQTexture2D
iimage3Dgl_int_image_3dQTexture3D
iimage2DRectgl_int_image_2d_rectQTextureRectangle
iimageCubegl_int_image_cubeQTextureCubeMap
iimageBuffergl_int_image_bufferQTextureBuffer
iimage1DArraygl_int_image_1d_arrayQTexture1DArray
iimage2DArraygl_int_image_2d_arrayQTexture2DArray
iimageCubeArraygl_int_image_cube_map_arrayQTextureCubeMapArray
iimage2DMSgl_int_image_2d_multisampleQTexture2DMultisample
iimage2DMSArraygl_int_image_2d_multisample_arrayQTexture2DMultisampleArray
uimage1Dgl_unsigned_int_image_1dQTexture1D
uimage2Dgl_unsigned_int_image_2dQTexture2D
uimage3Dgl_unsigned_int_image_3dQTexture3D
uimage2DRectgl_unsigned_int_image_2d_rectQTextureRectangle
uimageCubegl_unsigned_int_image_cubeQTextureCubeMap
uimageBuffergl_unsigned_int_image_bufferQTextureBuffer
uimage1DArraygl_unsigned_int_image_1d_arrayQTexture1DArray
uimage2DArraygl_unsigned_int_image_2d_arrayQTexture2DArray
uimageCubeArraygl_unsigned_int_image_cube_map_arrayQTextureCubeMapArray
uimage2DMSgl_unsigned_int_image_2d_multisampleQTexture2DMultisample
uimage2DMSArraygl_unsigned_int_image_2d_multisample_arrayQTexture2DMultisampleArray

OpenGL ES 3.1 支持以下图像类型:

GLSL 类型OpenGL 类型枚举纹理类型
图像 2DGL_IMAGE_2DQTexture2D
图像 3DGL_IMAGE_3DQTexture3D
图像立方体图像立方体QTextureCubeMap
image2DArraygl_image_2d_arrayQTexture2DArray
iimage2Dgl_int_image_2dQTexture2D
iimage3Dgl_int_image_3dQTexture3D
图像立方体gl_int_image_cubeQTextureCubeMap
iimage2DArraygl_int_image_2d_arrayQTexture2DArray
uimage2Dgl_unsigned_int_image_2dQTexture2D
uimage3Dgl_unsigned_int_image_3dQTexture3D
uimageCubegl_unsigned_int_image_cubeQTextureCubeMap
uimage2DArraygl_unsigned_int_image_2d_arrayQTexture2DArray

OpenGL ES 3.2 支持所有 OpenGL ES 3.1 图像类型以及以下类型:

GLSL 类型OpenGL 类型枚举纹理类型
图像缓冲区gl_image_bufferQTextureBuffer
图像立方数组图像立方图数组QTextureCubeMapArray
iimageBuffergl_image_bufferQTextureBuffer
图像立方数组gl_int_image_cube_map_arrayQTextureCubeMapArray
uimageBuffergl_unsigned_int_image_bufferQTextureBuffer
uimageCubeArraygl_unsigned_int_image_cube_map_arrayQTextureCubeMapArray

预期用途如下

Qt3DRender::QTexture2D *tex2D = new Qt3DRender::QTexture2D();
...
Qt3DRender::QMaterial *material = new Qt3DRender::QMaterial();
...
Qt3DRender::QParameter *imageParameter = new Qt3DRender::QParameter();
Qt3DRender::QShaderImage *shaderImage = new Qt3DRender::QShaderImage();

shaderImage->setTexture(tex2D);

imageParameter->setName("imageUniformName");
imageParameter->setValue(QVariant::fromValue(shaderImage));

material->addParameter(imageParamenter);

成员类型 文档

enum QShaderImage::Access

常数说明
Qt3DRender::QShaderImage::ReadOnly0只从着色器中读取图像
Qt3DRender::QShaderImage::WriteOnly1图像只能从着色器中写入
Qt3DRender::QShaderImage::ReadWrite2图像只能从着色器中读取和写入

enum QShaderImage::ImageFormat

此列表描述了所有可能的图像格式

常数说明
Qt3DRender::QShaderImage::NoFormat0GL_NONE
Qt3DRender::QShaderImage::Automatic1Qt 3D 将尝试根据引用的纹理自动确定格式。
Qt3DRender::QShaderImage::R8_UNorm0x8229GL_R8(GLSL 类型 r8,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RG8_UNorm0x822BGL_RG8(GLSL 类型 rg8,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA8_UNorm0x8058GL_RGBA8(GLSL 类型 rgba8,受 OpenGL 4.2+、OpenGL ES 3.1+ 支持)
Qt3DRender::QShaderImage::R16_UNorm0x822AGL_R16(GLSL 类型 r16,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RG16_UNorm0x822CGL_RG16(GLSL 类型 rg16,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA16_UNorm0x805BGL_RGBA16 (GLSL 类型 rgba16,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::R8_SNorm0x8F94GL_R8_SNORM(GLSL 类型 r8_snorm,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RG8_SNorm0x8F95GL_RG8_SNORM(GLSL 类型 rg8_snorm,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA8_SNorm0x8F97GL_RGBA8_SNORM (GLSL 类型 rgba8_snorm,受 OpenGL 4.2+、OpenGL ES 3.1+ 支持)
Qt3DRender::QShaderImage::R16_SNorm0x8F98GL_R16_SNORM(GLSL 类型 r16_snorm,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RG16_SNorm0x8F99GL_RG16_SNORM(GLSL 类型 rg16_snorm,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA16_SNorm0x8F9BGL_RGBA16_SNORM (GLSL 类型 rgba16_snorm,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::R8U0x8232GL_R8UI(GLSL 类型 r8ui,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RG8U0x8238GL_RG8UI(GLSL 类型 rg8ui,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA8U0x8D7CGL_RGBA8UI(GLSL 类型 rgba8ui,受 OpenGL 4.2+、OpenGL ES 3.1+ 支持)
Qt3DRender::QShaderImage::R16U0x8234GL_R16UI(GLSL 类型 r16ui,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RG16U0x823AGL_RG16UI(GLSL 类型 rg16ui,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA16U0x8D76GL_RGBA16UI(GLSL 类型 rgba16ui,受 OpenGL 4.2+、OpenGL ES 3.1+ 支持)
Qt3DRender::QShaderImage::R32U0x8236GL_R32UI(GLSL 类型 r32ui,受 OpenGL 4.2+、OpenGL ES 3.1 支持)
Qt3DRender::QShaderImage::RG32U0x823CGL_RG32UI(GLSL 类型 rg32ui,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA32U0x8D70GL_RGBA32UI(GLSL 类型 rgba32ui,受 OpenGL 4.2+、OpenGL ES 3.1+ 支持)
Qt3DRender::QShaderImage::R8I0x8231GL_R8I(GLSL 类型 r8i,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RG8I0x8237GL_RG8I(GLSL 类型 rg8i,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA8I0x8D8EGL_RGBA8I (GLSL 类型 rgba8i,受 OpenGL 4.2+、OpenGL ES 3.1+ 支持)
Qt3DRender::QShaderImage::R16I0x8233GL_R16I(GLSL 类型 r16i,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RG16I0x8239GL_RG16I(GLSL 类型 rg16i,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA16I0x8D88GL_RGBA16I(GLSL 类型 rgba16i,受 OpenGL 4.2+、OpenGL ES 3.1 支持)
Qt3DRender::QShaderImage::R32I0x8235GL_R32I(GLSL 类型 r32i,受 OpenGL 4.2+、OpenGL ES 3.1+ 支持)
Qt3DRender::QShaderImage::RG32I0x823BGL_RG32I(GLSL 类型 rg32i,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA32I0x8D82GL_RGBA32I(GLSL 类型 rgba32i,受 OpenGL 4.2+、OpenGL ES 3.1+ 支持)
Qt3DRender::QShaderImage::R16F0x822DGL_R16F(GLSL 类型 r16f,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RG16F0x822FGL_RG16F(GLSL 类型 rg16f,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA16F0x881AGL_RGBA16F(GLSL 类型 rgba16f,受 OpenGL 4.2+、OpenGL ES 3.1+ 支持)
Qt3DRender::QShaderImage::R32F0x822EGL_R32F(GLSL 类型 r32f,受 OpenGL 4.2+、OpenGL ES 3.1+ 支持)
Qt3DRender::QShaderImage::RG32F0x8230GL_RG32F(GLSL 类型 rg32f,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGBA32F0x8814GL_RGBA32F(GLSL 类型 rgba32f,受 OpenGL 4.2+、OpenGL ES 3.1+ 支持)
Qt3DRender::QShaderImage::RG11B10F0x8C3AGL_R11F_G11F_B10F(GLSL 类型 r11f_g11f_b10f,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGB10A20x8059GL_RGB10_A2(GLSL 类型 rgb10_a2,受 OpenGL 4.2+ 支持)
Qt3DRender::QShaderImage::RGB10A2U0x906FGL_RGB10_A2UI(GLSL 类型 rgb10_a2ui,受 OpenGL 4.2+ 支持)

属性文档

access : Access

指定允许着色器实例访问图像的类型。如果着色器试图写入或读取不兼容访问的图像,其行为将是未定义的。

默认值为QShaderImage::ReadWrite

访问功能:

Qt3DRender::QShaderImage::Access access() const
void setAccess(Qt3DRender::QShaderImage::Access access)

Notifier 信号:

void accessChanged(Qt3DRender::QShaderImage::Access access)

format : ImageFormat

指定图像格式,这对于从着色器中将值存储到图像中非常重要。

格式不一定要与引用纹理的格式相同。但必须兼容(大小匹配,但不一定是类类型匹配)。例如,格式为 R32F(大小为 32 位,类别为 1x32)的纹理可以与格式为 RGBA8I(大小为 32 位,类别为 4x8)的图像一起使用。OpenGL 规范的表 8.27 显示了所有支持的图像格式的大小和类别。

默认情况下,Qt3D 将尝试设置图像格式,使其与引用纹理的格式相匹配。

默认值是QShaderImage::Automatic

访问函数:

Qt3DRender::QShaderImage::ImageFormat format() const
void setFormat(Qt3DRender::QShaderImage::ImageFormat format)

Notifier 信号:

void formatChanged(Qt3DRender::QShaderImage::ImageFormat format)

layer : int

表示QShaderImage 应使用引用纹理中的哪个图层。如果layered 设置为 true 或引用纹理的类型与图层不兼容,则此属性不起任何作用。

注: 当引用的纹理类型为立方体贴图或立方体贴图数组,且ĺayered 设置为 false 时,面和层将按以下方式获取:

cubeMapLayer = layer / 6
cubeMapFace = layer - (cubeMapLayer * 6)

默认值为 0。

访问功能:

int layer() const
void setLayer(int layer)

通知信号:

void layerChanged(int layer)

layered : bool

*

如果设置为 true,如果引用的纹理是一维数组、二维数组、三维数组、立方体贴图、立方体贴图数组或二维多采样数组纹理,则将绑定整个关卡的所有图层。如果设置为 false,则只绑定layer 属性指定的单个图层。

默认值为false

访问功能:

bool layered() const
void setLayered(bool layered)

通知信号:

void layeredChanged(bool layered)

mipLevel : int

表示QShaderImage 应使用引用纹理中的哪个 mipLevel。

默认值为 0。

访问功能:

int mipLevel() const
void setMipLevel(int mipLevel)

Notifier 信号:

void mipLevelChanged(int mipLevel)

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.