首页 > 解决方案 > RenderPass 在 Qt3D 中是如何工作的

问题描述

在给定的代码中,RenderPass 和 filterKeys 有什么用,它是如何工作的?

过滤键{名称:“通过”;值:“阴影贴图”}

在上面的语句中,谁使用了这些名称和值?

Technique {
            graphicsApiFilter {
                api: GraphicsApiFilter.OpenGL
                profile: GraphicsApiFilter.CoreProfile
                majorVersion: 3
                minorVersion: 2
            }

            renderPasses: [
                RenderPass {
                    filterKeys: [ FilterKey { name: "pass"; value: "shadowmap" } ]

                    shaderProgram: ShaderProgram {
                        vertexShaderCode:   loadSource("qrc:/shaders/shadowmap.vert")
                        fragmentShaderCode: loadSource("qrc:/shaders/shadowmap.frag")
                    }

                    renderStates: [
                        PolygonOffset { scaleFactor: 4; depthSteps: 4 },
                        DepthTest { depthFunction: DepthTest.Less }
                    ]
                },

                RenderPass {
                    filterKeys: [ FilterKey { name : "pass"; value : "forward" } ]

                    shaderProgram: ShaderProgram {
                        vertexShaderCode:   loadSource("qrc:/shaders/ads.vert")
                        fragmentShaderCode: loadSource("qrc:/shaders/ads.frag")
                    }

                    // no special render state set => use the default set of states
                }
            ]
        }

标签: qtquick2qt3d

解决方案


过滤器键需要与框架图中RenderPassFilter中的相应过滤器键匹配。

例如,如果您想要一个仅使用前向传递中指定的着色器进行渲染的帧图,您可以编写如下内容:

RenderSettings{ 
    activeFrameGraph: Viewport {
        RenderPassFilter {
            matchAny: [FilterKey { name: "pass"; value: "forward" }]
            RenderSurfaceSelector {
                ClearBuffers {
                }
            }
        }
    }
}

您可以在同一个框架图中拥有多个 RenderPassFilter。这允许您使用不同的着色器渲染相同的场景,例如在不同的视口中显示具有不同效果的场景,或者绘制到不同的纹理并在最终通道中将它们混合在一起。


推荐阅读