gpt4 book ai didi

Qt3D 不同 RenderPasses 的不同 Material

转载 作者:行者123 更新时间:2023-12-05 03:25:42 25 4
gpt4 key购买 nike

我有一个带有 2 个视口(viewport)的 QML Scene3D,窗口的左半部分和右半部分。该场景包含两个摄像机(每个视口(viewport)一个)和一个环面网格。我想对同一个环面使用视口(viewport)特定的 Material ,即分别在左视口(viewport)和右视口(viewport)中渲染时使用不同的 QMaterials(QEffects、QShaderPrograms 等)。

// main.qml

Entity {
id: rootEntity

components: [
MyFrameGraph {
camLeft: cameraLeft
camRight: cameraRight
},
InputSettings { }
]

Camera {
id: cameraLeft
projectionType: CameraLens.PerspectiveProjection
position: Qt.vector3d( 0.0, 0.0, -200.0 )
upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
}

Camera {
id: cameraRight
projectionType: CameraLens.PerspectiveProjection
position: Qt.vector3d( 0.0, 200.0, 0.0 )
upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
}

TorusMesh {
id: torusMesh
radius: 20
minorRadius: 5
}

Transform {
id:torusTransform
}

Material{
id: myTorusMaterial
effect: MyEffect{}
}

Entity {
id: torus
components: [torusMesh,torusTransform,myTorusMaterial]
}
}

我的 FrameGraph 包含两个视口(viewport)的两个分支,而叶节点是 RenderPassFilters。

//MyFrameGraph.qml

RenderSettings {
id: root

property Camera camLeft
property Camera camRight

activeFrameGraph: RenderSurfaceSelector {
id: surfaceSelector

Viewport {
id: mainViewport
normalizedRect: Qt.rect(0.0, 0.0, 1.0, 1.0)

ClearBuffers {
buffers: ClearBuffers.ColorDepthBuffer
clearColor: "black"
}

Viewport {
normalizedRect: Qt.rect(0.0, 0.0, 0.5, 1)
CameraSelector {
camera: root.camLeft
RenderStateSet {
renderStates: [
DepthTest {depthFunction: DepthTest.Less}
]
RenderPassFilter {
matchAny: [FilterKey { name: "pass"; value: "myMaterialLeft" }]
}
}
}
}
Viewport {
normalizedRect: Qt.rect(0.5, 0.0, 0.5, 1)
CameraSelector {
camera: root.camRight
RenderStateSet {
renderStates: [
DepthTest {depthFunction: DepthTest.Less}
]

RenderPassFilter {
matchAny: [FilterKey { name: "pass"; value: "myMaterialRight" }]
}
}
}
}
}
}
}

在我的自定义 Material /效果中,我在 RenderPass 对象中使用 FilterKeys。

//MyEffect.qml

Effect {
id: root

property color maincolor: Qt.rgba(0.0, 1.0, 0.0, 1.0)

ShaderProgram {
id: myShaderLeft
vertexShaderCode: loadSource("qrc:/shader/myShaderLeft.vert")
fragmentShaderCode: loadSource("qrc:/shader/myShaderLeft.frag")
}
ShaderProgram {
id: myShaderRight
vertexShaderCode: loadSource("qrc:/shader/myShaderRight.vert")
fragmentShaderCode: loadSource("qrc:/shader/myShaderRight.frag")
}

parameters: [
Parameter {
name: "maincolor"
value: Qt.vector3d(root.maincolor.r, root.maincolor.g, root.maincolor.b)
}
]

techniques: [
Technique {
filterKeys: [FilterKey { name: "renderingStyle"; value: "forward" }]

graphicsApiFilter {
api: GraphicsApiFilter.OpenGL
profile: GraphicsApiFilter.CoreProfile
majorVersion: 3
minorVersion: 1
}
RenderPass {
id:renderPassLeft
filterKeys: [ FilterKey { name: "pass"; value: "myMaterialLeft" } ]

shaderProgram: myShaderLeft
renderStates: [CullFace { mode: CullFace.NoCulling }]
}
RenderPass {
id: renderPassRight
filterKeys: [ FilterKey { name: "pass"; value: "myMaterialRight" } ]

shaderProgram: myShaderRight
renderStates: [CullFace { mode: CullFace.NoCulling }]
}
renderPasses:[renderPassLeft,renderPassRight]
}
]
}

这按预期工作,对象在左视口(viewport)中使用 myShaderLeft 渲染,在右视口(viewport)中使用 myShaderRight 渲染。

现在我想在左视口(viewport)中渲染时使用默认的 Qt Material (QMetalRoughMaterial),在右视口(viewport)中渲染时使用我的自定义 Material /效果。我怎样才能做到这一点?

一个想法是通过 metalRougMaterial.effect.techniques[0].renderPasses[0].shaderProgram 访问 MetalRoughMaterial 的 ShaderProgram,并将其用作我的自定义 Material /效果的渲染 channel 之一。但是,metalRougMaterial.effect.techniques 返回一个 undefined object 。

MetalRoughMaterial {
id: metalRoughMaterial
baseColor: "red"
}

最佳答案

来自source code ,它看起来像 effect 不是您可以在 Material 上访问的属性。

我不确定这是否可行,但我想您可以在 C++ 中对 Material 进行子类化并使效果易于访问。这样,一旦您将其注册为新的 QML 类型并使用此 QML 类型而不是普通 Material 类型,您就可以在 QML 中对其进行修改。

我能想到的另一个选择是两次创建对象,一次是右视口(viewport),一次是左视口(viewport)。然后创建两个 QLayer,并为每个 framegraph 分支分别添加一个和两个相应的 QLayerFilter,您还向每个分支添加一层。

我猜这在计算上归结为相同的负载,但你必须考虑设置位置等是如何工作的(我认为你可以向两者添加相同的 QTransform,但我不确定)。

最后但同样重要的是,您可能可以(使用您的过滤键)在 QML 中完全重新创建整个 Material ,但这可能需要大量工作。

关于Qt3D 不同 RenderPasses 的不同 Material ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71920352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com