如何在WPF 3D中制作非模糊图像

5
我使用了Viewport3D和ModelVisual3D来创建一个简单的ImageBrush,其中包含一张图片(我试过JPG、PNG格式),但它显示的图像模糊,而原始图像非常清晰。
我不知道如何在3D中保持原始质量...
我还尝试了一些2D解决方案,例如RenderOptions.BitmapScalingMode和SnapsToDevicePixels,但似乎无法解决3D情况下的问题。
有人遇到过这个问题或者知道解决方法吗?
以下是示例代码:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
Title="Window6" Height="600" Width="600">

<Window.Resources>
    <MeshGeometry3D x:Key="Card1" Positions="-0.67,1,0 -0.67,-1,0 0.67,-1,0 0.67,1,0"
        TextureCoordinates="0,0 0,1 1,1 1,0" TriangleIndices="0 1 2 0 2 3" />
</Window.Resources>
<DockPanel Height="600" Width="600">
    <Viewport3D Width="415.67" x:Name="viewport" Margin="0,23.363,0,64.363" DockPanel.Dock="Left">
        <Viewport3D.Camera>
            <PerspectiveCamera x:Name="perCamera" x:Uid="perCamera" FieldOfView="60" Position="0,0,5" />
        </Viewport3D.Camera>
        <ModelVisual3D>
            <ModelVisual3D.Content>
            <Model3DGroup >
                <GeometryModel3D Geometry="{StaticResource Card1}">
                    <GeometryModel3D.Material>
                        <DiffuseMaterial>
                            <DiffuseMaterial.Brush>
                                <ImageBrush ImageSource="images\card.png"/>
                            </DiffuseMaterial.Brush>
                        </DiffuseMaterial>
                    </GeometryModel3D.Material>
                </GeometryModel3D>
                </Model3DGroup>
            </ModelVisual3D.Content>
        </ModelVisual3D>
        <!-- light -->
        <ModelVisual3D>
            <ModelVisual3D.Content>
                <DirectionalLight Color="#FFFFFFFF" Direction="0,0,-1"/>
            </ModelVisual3D.Content>
        </ModelVisual3D>

    </Viewport3D>
</DockPanel>

2个回答

2
大多数图形硬件要求纹理的大小是2的幂(例如512x512像素)。 我猜测,WPF首先将您的图片大小“调整”为2的幂,然后将该结果缩放到您需要的任何大小。从2的幂缩放到所需的目标大小通常使用强调速度而不是质量的算法完成(除非您执行某些指定,但我在上面看不到)。
为了测试这个假设,我会创建一个尺寸都是2的幂的绘图,然后以原始分辨率精确显示它。 如果这是问题的根源,这应该最小化(甚至消除)问题。

还有一篇有趣的帖子,可以加强你的评论。http://gamedev.stackexchange.com/questions/26187/why-are-textures-always-square-powers-of-two-what-if-they-arent - Andreas

1

对于 Image 元素,请使用 UseLayoutRounding="True" 属性。


图像元素中不存在名为 UseLayoutRounding 的属性。 - MC9000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接