代码之家  ›  专栏  ›  技术社区  ›  rubenvb

使用QSGTexture/QSGMaterial和Qt的RHI为着色器实现自定义纹理格式

  •  0
  • rubenvb  · 技术社区  · 3 年前

    在Qt 6.2中,有一个完整的“图形API独立”基础设施系统(在工具和C++方面),使您能够在QML中渲染事物,而无需编写Vulkan、Metal、Direct3D或OpenGL。

    基于 the "custom material" example QQuickWindow::createTextureFromImage ,我能够在不更改代码的情况下,使用OpenGL和Metal通过自定义顶点和片段着色器将图像渲染到屏幕。大获成功!

    但是纹理创建功能将图像转换为RGBA8/GL_RGBA,因此不可能使用例如16位或浮点图像。这个 QQuickWindow::createTextureFromImage 文件显示:

    重新实现QSGTexture以创建具有不同参数的纹理。

    QSGTexture documentation 状态:

    使用纹理重新实现的材质会更新SampledImage(),以提供决定应在给定着色器资源绑定点暴露哪个QSGTexture的底层原生纹理的逻辑。

    使用提供的API看到这一点的唯一方法是执行原生图形API调用,从而在QSGTexture和QSGMaterialShader中实现我的特殊格式纹理,用于我想要支持的每个图形API。这似乎与QRhi应该提供的整个设置背道而驰(参见例如。 here 概述)。 例如,附加纹理、3D纹理或任何其他真正不被简单顶点+片段着色器和单个RGBA纹理覆盖的纹理也是如此(前提是它们提供了对mipmapping和各向异性过滤的一些支持)。

    我是不是错过了什么?这在未来会有所改善吗?或者,对于“通过QML呈现简单UI”的情况之外的任何东西,我们是否仍在实现实际的图形API特定代码? 我想Qt 3D模块也存在同样的限制;由于底层的QRhineneneba API不是公共的,所以支持的场景之外的任何内容都是不可实现的?

    0 回复  |  直到 3 年前
        1
  •  0
  •   rubenvb    1 年前

    Qt 6更改了QSG API的这一部分,并实现了一个示例,展示了如何使用半公共QRhi API在自定义QSGRenderNode中进行自定义渲染: https://doc.qt.io/qt-6/qtquick-scenegraph-customrendernode-example.html

    这使用来自私有头的一些比特(从API不是100%稳定的意义上讲,但他们努力使其尽可能保持不变)来设置自定义渲染管道,该管道允许各种独立于渲染后端的资源。

    它并没有完全实现自定义纹理图像格式,但它允许您以任何想要的格式上传纹理,并让着色器以您想要的方式处理它,作为渲染场景图的一部分,我认为这已经足够强大了。

    推荐文章