使用带有旋转变换的像素着色器时Silverlight中的像素化/过滤问题

使用带有旋转变换的像素着色器时Silverlight中的像素化/过滤问题,silverlight,rendering,pixel-shader,Silverlight,Rendering,Pixel Shader,我正在使用Silverlight进行一些与游戏相关的渲染,当我将像素着色器附加到具有(旋转)变换的图像时,我看到一种奇怪的模糊像素化效果 下面是问题的屏幕截图。左边的图像只是一个变换。右侧的图像具有变换和像素着色器 (来源:) 您可以在操作中看到这一点(单击Silverlight控件以添加像素着色器) 讨论中的像素着色器是SilverSprite中用于为图像着色的着色器。你可以 我正在应用的转换是一个矩阵transform(带有手动计算的平移、缩放、旋转矩阵)。旋转图像时出现问题 着色器和变换

我正在使用Silverlight进行一些与游戏相关的渲染,当我将像素着色器附加到具有(旋转)变换的图像时,我看到一种奇怪的模糊像素化效果

下面是问题的屏幕截图。左边的图像只是一个变换。右侧的图像具有变换和像素着色器


(来源:)

您可以在操作中看到这一点(单击Silverlight控件以添加像素着色器)

讨论中的像素着色器是SilverSprite中用于为图像着色的着色器。你可以

我正在应用的转换是一个
矩阵transform
(带有手动计算的平移、缩放、旋转矩阵)。旋转图像时出现问题

着色器和变换都要应用到的元素是添加到代码中的
画布中的
图像
。图像的
ImageSource
是一个
WriteableBitmap
,但这种效果也会发生在
位图图像上

我的问题是:是什么导致了这种模糊像素化?如何减少或消除它?

从PDC09观看之后,我对Silverlight中的渲染系统的工作原理有了更好的了解。这个问题不是通过演示直接解决的,但是了解事物的呈现顺序会有所帮助

与我的问题相关的渲染步骤顺序是:渲染对象的子对象(和/或对象本身),渲染通过
效果
,然后通过
渲染转换

在任何情况下,如果将
RenderTransform
应用于对象或其子对象已应用
效果
(即:呈现树中
效果
之后的
RenderTransform
),则
RenderTransform
以“低质量”完成产生这种“模糊性”的模式


然后,解决方案是将
效果
移动到
渲染转换
之后。在我的例子中,这意味着将
图像
放在自己的
画布上
,将
渲染变换
应用于
图像
,将
效果
应用于
画布

,这似乎是一个明显的问题,但如果使用着色器而不是变换,你会得到像素化吗?@Anthony:有趣的是,对虽然它不那么明显(它不“模糊”)。输出逐像素匹配原始精灵像素,就好像它的位置是通过
Math.Floor
输入的一样。也删除像素着色器,但继续使用分数位置,然后精灵将在像素之间“混合”(似乎是双线性插值)。另一个有趣的是,如果我使用不旋转的放大变换,则输出是具有双线性过滤的精灵-无论是否附加像素着色器都是如此(它可能还在做上面提到的
Math.Floor
的事情,但这是不可能的)。如果我旋转缩放的精灵,那么它仍然会得到“fuzzy”使用着色器的效果-但它仍处于我的原始示例中的一个输出像素偏移比例。更多附加信息:如果没有像素着色器,则有一个启用GPU的曲面和一个中间曲面。使用像素着色器,有两个启用GPU的曲面和一个中间曲面。无论启用什么,问题都存在加速设置。