• RuntimesUnity
  • 如何在shader中获取当前帧渲染的图片内容而不是整个图集?

我在Unity中编写了一个shader, 此shader将通过噪声纹理生成特殊的效果并应用到_MainTex上

但是当我将其应用到spine 动画上时发现shader进行采样的主纹理是整个图集, 这未能实现我希望的效果.
有什么办法可以把当前渲染的内容作为mainTex进行采样吗?

Related Discussions
...

在Spine动画中,shader直接采样的确是整个图集(Atlas),而不是单独的帧或图像。这是因为Spine的运行时使用图集来高效地管理和渲染动画中的各个部件。如果你希望在shader中仅对当前帧的内容进行操作,而不是整个图集,你需要采用一种不同的方法来实现这个效果。

一种可能的解决方案是使用Unity的RenderTexture功能,将当前帧的Spine动画渲染到一个RenderTexture上,然后将这个RenderTexture作为shader的输入。这样,shader就可以对当前帧的渲染结果进行采样和处理,而不是直接操作整个图集。这个过程涉及到在Unity中设置一个摄像机,将其渲染目标设置为RenderTexture,并确保只渲染你想要的Spine动画对象。

具体步骤如下:

  1. 创建一个RenderTexture并将其分配给一个专门用于渲染Spine动画的摄像机。
  2. 将这个摄像机的视角和位置调整到只捕捉到Spine动画。
  3. 在你的shader中,使用这个RenderTexture作为主纹理(_MainTex)进行采样。

请注意,这种方法可能会增加渲染成本,因为它涉及到额外的渲染步骤。此外,这种方法的实现细节可能会根据你的具体需求和项目设置有所不同。

  • इस पर Init ने जवाब दिया।

    Spinebot
    还有其他解决方案吗?

    • इस पर Misaki ने जवाब दिया।

      Init Spinebot's answer seems appropriate, so I'm not sure why you want a different solution. Is there a reason you don't want to use RenderTexture?

      • इस पर Init ने जवाब दिया।

        Misaki
        我是一个新手. 我在维护一套运行很多年的代码. 之前在这个项目中并未使用过RendererTexture, 并且这个是一个发布在移动设备上的游戏, 我不知道使用rendererTexture是否会导致性能相关的问题.
        对于我来说修改这个代码使之能够使用rendererTexture是一个挑战
        我猜推荐使用RendererTexture, 实际上是使用"后处理"这一方式对渲染后的每一帧进行处理?

        • इस पर Misaki ने जवाब दिया।
          • संपादित

          Init It is true that using RenderTexture may adversely affect performance, which is why it is generally recommended not to use it all the time, but only temporarily when needed. If you do this, I doubt it will have much of a negative impact on performance, although it depends on how many skeletons in the scene use RenderTexture. In general, performance issues always need to be tested on the actual target device to be sure. If you test it and find an unacceptable negative impact, you can talk to us again.

          There is an example scene that uses RenderTexture, so you may want to refer to it: Spine Examples/Other Examples/RenderTexture FadeOut Transparency
          Also, check out the example scripts in the Spine Examples/Scripts/Sample Components/SkeletonRenderTexture folder.

          • इस पर Init ने जवाब दिया।

            Misaki
            好的, 谢谢你的帮助!!

            • Misaki ने इसे लाइक किया।

            Misaki
            你好, 我通过新建工程导入下载的spine 3.8 运行库开始测试(我在spine 4.2 运行库中找到了脚本和示例场景), 当我计划将脚本导入开发工程时, 发现测试工程的spine 3.8 运行库是"spine-unity-3.8-2021-11-10.unitypackage", 而开发工程的spine 3.8 运行库是"spine-unity-3.8-2020-03-17.unitypackage
            ", 我可以直接升级正式版本吗?

            二者的差异是 "spine-unity-3.8-2020-03-17.unitypackage" 的 SkeletonRenderer 没有 OnMeshAndMaterialsUpdated

            我需要进行升级, 还是使用其他的事件去代替? 或者我直接修改"spine-unity-3.8-2020-03-17.unitypackage" 的 SkeletonRenderer 添加一个OnMeshAndMaterialsUpdated?

            • इस पर Misaki ने जवाब दिया।

              Init I am not sure if I understand your question correctly because some of the terms you use seem a bit imprecise, but at least upgrading "spine-unity-3.8-2020-03-17" to "spine-unity-3.8-2021-11-10" is basically safe. Upgrading a major or minor version should be done with caution, but upgrading a patch version should be safe as long as you follow the upgrade instructions in the documentation: https://zh.esotericsoftware.com/spine-unity#%E6%9B%B4%E6%96%B0spine-unity%E8%BF%90%E8%A1%8C%E6%97%B6

              • इस पर Init ने जवाब दिया।

                Misaki
                好的, 谢谢!!!

                • Misaki ओर Harald ने इसे लाइक किया।