2012-09-11 12 views
7

Ich bin neu in "wpf" und ich bin über das folgende Problem gekommen: In meinem Projekt versuche ich, kleine Auflösung .png als Textur für ein Modell zu verwenden. Wenn ich in Blender deaktivieren Mipmapping (wo ich den Würfel gebaut) das Ergebnis genau das, was ich will:Mipmapping in wpf

no mipmapping

Aber in der WPF-Projekt stellt sich die verschwommenen Effekt nie aus:

wpf result

Hier ist mein Code:

<Window x:Class="GCS.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="504" Width="525" ShowInTaskbar="True"> 
<Grid> 
     <Viewport3D Name="myViewport" 
      xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
      <Viewport3D.Resources> 
       <MaterialGroup x:Key="Material"> 
        <DiffuseMaterial> 
         <DiffuseMaterial.Brush> 
          <ImageBrush RenderOptions.BitmapScalingMode="NearestNeighbor" ViewportUnits="Absolute" ImageSource="char.png"/> 
         </DiffuseMaterial.Brush> 
        </DiffuseMaterial> 
       </MaterialGroup> 
      </Viewport3D.Resources> 
      <Viewport3D.Camera> 
       <PerspectiveCamera Position="7.8,-11,-0.8" NearPlaneDistance="1" FarPlaneDistance="50" LookDirection="-0.4,0.9,-0.3" UpDirection="0,0,1" FieldOfView="15"/> 
      </Viewport3D.Camera> 
      <Viewport3D.Children> 
       <ModelVisual3D> 
        <ModelVisual3D.Content> 
         <Model3DGroup> 
          <GeometryModel3D Material="{StaticResource Material}"> 
           <GeometryModel3D.Transform> 
            <Transform3DGroup> 
             <TranslateTransform3D OffsetZ="0" OffsetX="0" OffsetY="-7"/> 
             <ScaleTransform3D ScaleZ="1" ScaleY="1" ScaleX="1"/> 
             <RotateTransform3D> 
              <RotateTransform3D.Rotation> 
               <AxisAngleRotation3D Axis="1,0,0" Angle="92"/> 
              </RotateTransform3D.Rotation> 
             </RotateTransform3D> 
             <TranslateTransform3D OffsetZ="0" OffsetX="0" OffsetY="7"/> 
             <TranslateTransform3D OffsetZ="-6.622" OffsetX="0" OffsetY="-0.023"/> 
            </Transform3DGroup> 
           </GeometryModel3D.Transform> 
           <GeometryModel3D.Geometry> 
            <MeshGeometry3D 
             Normals="-1,0,0 -1,0,0 -1,0,0 -1,0,0 0,0,-1 0,0,-1 0,0,-1 0,0,-1 1,0,0 1,0,0 1,0,0 1,0,0 0,0,1 0,0,1 0,0,1 0,0,1 0,-1,0 0,-1,0 0,-1,0 0,-1,0 0,1,0 0,1,0 0,1,0 0,1,0" 
             Positions="-1,6,-1 -1,6,1 -1,8,1 -1,8,-1 -1,8,-1 1,8,-1 1,6,-1 -1,6,-1 1,8,-1 1,8,1 1,6,1 1,6,-1 -1,6,1 1,6,1 1,8,1 -1,8,1 -1,6,1 -1,6,-1 1,6,-1 1,6,1 1,8,1 1,8,-1 -1,8,-1 -1,8,1" 
             TextureCoordinates="0,0.5 0.125,0.5 0.125,0.25 0,0.25 0.5,0.25 0.375,0.25 0.375,0.5 0.5,0.5 0.375,0.25 0.25,0.25 0.25,0.5 0.375,0.5 0.125,0.5 0.25,0.5 0.25,0.25 0.125,0.25 0.375,0.25 0.375,0 0.25,0 0.25,0.25 0.25,0.25 0.25,0 0.125,0 0.125,0.25" 
             TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14 12 14 15 16 17 18 16 18 19 20 21 22 20 22 23"/> 
           </GeometryModel3D.Geometry> 
          </GeometryModel3D> 
         </Model3DGroup> 
        </ModelVisual3D.Content> 
       </ModelVisual3D> 
       <ModelVisual3D> 
        <ModelVisual3D.Content> 
         <AmbientLight Color="#ffffff"/> 
        </ModelVisual3D.Content> 
       </ModelVisual3D> 
      </Viewport3D.Children> 
     </Viewport3D> 
</Grid> 

Ich habe eine Menge Suche im Internet gemacht und viele Ansätze ausprobiert: erzwungenes Software-Rendering, verwende DrawingBrush anstelle von ImageBrush, aber das Ergebnis ist dasselbe. Gibt es eine Möglichkeit, ein solches Rendering zu überwinden?

+0

Sie setzen 'RenderOptions.BitmapScalingMode' auf die' ImgaeBrush'. Ich weiß nicht, ob das die Lösung ist (daher ein Kommentar und nicht eine Antwort), aber Sie können es auch auf 'GeometryModel3D',' ModelVisual3D' und 'ViewPort3D', sowie' Window' und '' setzen Gitter'. Haben Sie eine oder alle dieser Optionen ausprobiert, um zu sehen, ob es einen Unterschied macht? Es scheint mir möglich zu sein, dass der ImageBrush selbst nicht die Skalierung in einem 3D-Szenario durchführt und daher das Setzen von RenderOptions auf das Pinselobjekt nicht den gewünschten Effekt hat. –

+0

Danke für eine Antwort. Tatsächlich habe ich alle diese Varianten einmal und sogar zusammen ausprobiert. Das Ergebnis ist das gleiche (( – user1662530

+0

Ah - aus Ideen dann! Meine Vermutung ist, dass das Rendering von der 3D-Hardware in Ihrer Grafikkarte gemacht wird, über die WPF anscheinend weniger Kontrolle hat, als wir möchten. Das ist wirklich ein denke aber, und ich habe keine Ahnung, wie oder ob es möglich ist, es zu überschreiben, wenn das der Fall ist.Langschuss, aber sind Ihre Grafikkartentreiber auf dem neuesten Stand? –

Antwort

1

Versuchen Sie, den folgenden Ansatz VisualBrush mit - es ist klar produziert, aliased Texturierung:

Screenshot

 <DiffuseMaterial x:Key="Material"> 
      <DiffuseMaterial.Brush> 
       <VisualBrush RenderOptions.CachingHint="Cache"> 
        <VisualBrush.Visual> 
         <Image Source="char.png" RenderOptions.BitmapScalingMode="NearestNeighbor" /> 
        </VisualBrush.Visual> 
       </VisualBrush> 
      </DiffuseMaterial.Brush> 
     </DiffuseMaterial> 
    </Grid.Resources> 


    <Viewport3D Name="myViewport"> 
     <Viewport3D.Camera> 
      <PerspectiveCamera Position="0 0.5 1.5" LookDirection="0 0 -1" 
          UpDirection="0 1 0" FieldOfView="120" /> 
     </Viewport3D.Camera> 
     <Viewport3D.Children> 
      <ModelVisual3D> 
       <ModelVisual3D.Content> 
        <GeometryModel3D Material="{StaticResource Material}"> 

         <GeometryModel3D.Geometry> 
          <MeshGeometry3D 
         Positions="0 0 0, 0 1 0, 1 0 0, 1 1 0" 
         TriangleIndices="0 2 3, 0 3 1" 
         TextureCoordinates="0 1, 0 0, 1 1, 1 0" /> 
         </GeometryModel3D.Geometry> 

        </GeometryModel3D> 
       </ModelVisual3D.Content> 
      </ModelVisual3D> 

      <ModelVisual3D> 
       <ModelVisual3D.Content> 
        <AmbientLight Color="#ffffff"/> 
       </ModelVisual3D.Content> 
      </ModelVisual3D> 
     </Viewport3D.Children> 
    </Viewport3D> 
</Grid>