ShaderEffectSource不遵循源项scale属性,如何获取正确缩放的渲染结果
问题原因
ShaderEffectSource捕获的是源项自身逻辑尺寸的渲染结果,源项的scale属于父级坐标系下的变换属性,不会改变源项本身的内在渲染分辨率,因此默认捕获到的还是50x50分辨率的原始纹理,后续手动给ShaderEffectSource加缩放只是对低分辨率纹理做插值拉伸,自然会出现模糊。
解决方案
通过textureSize属性手动指定离屏渲染的纹理分辨率,将其和源项的缩放系数绑定,就能直接捕获到缩放后的高清晰度渲染结果,修改后的代码如下:
Row { spacing: 100 Rectangle { id: rect scale: 2.0 color: "blue" width: 50 height: 50 Text { text: "TEST" color: "white" anchors.centerIn: parent } } ShaderEffectSource { sourceItem: rect live: true // 纹理分辨率匹配源项缩放后的实际像素尺寸 textureSize: Qt.size(rect.width * rect.scale, rect.height * rect.scale) // 以下两种显示方式二选一即可 // 方式1:直接设置宽高为缩放后的尺寸,无需额外scale width: rect.width * rect.scale height: rect.height * rect.scale // 方式2:保持宽高和源项逻辑尺寸一致,额外加scale属性,纹理分辨率足够不会模糊 // width: rect.width // height: rect.height // scale: rect.scale } }
修改后ShaderEffectSource会先以放大后的分辨率渲染源项内容,再进行显示,不会出现插值模糊的问题,和源项的缩放效果完全一致。
如果源项的缩放不是来自自身scale属性,而是继承自父容器的缩放,只需要将所有上级变换的总缩放系数计算在内,乘以源项宽高作为textureSize即可。
内容的提问来源于stack exchange,提问作者Murat Şeker
相关产品推荐
相关产品推荐

