2012-09-11 12 views
7

Sono nuovo di "wpf" e ho trovato il seguente problema: Nel mio progetto cerco di usare una piccola risoluzione .png come texture per un modello. Quando ho disabilitare mipmapping in Blender (dove ho costruito il cubo) il risultato è proprio quello che voglio:Mipmapping nel wpf

no mipmapping

Ma nel progetto WPF l'effetto sfocato non si spegne mai:

wpf result

Qui è il mio codice:

<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> 

Ho fatto molte ricerche su Internet e ho provato molti approcci: il rendering del software forzato, usato DrawingBrush invece di ImageBrush ma il risultato è lo stesso. C'è un modo per superare questo rendering?

+0

Si sta impostando 'RenderOptions.BitmapScalingMode' sul' ImgaeBrush'. Non so se questa sia la soluzione (quindi un commento piuttosto che una risposta), ma puoi anche impostarla su 'GeometryModel3D',' ModelVisual3D' e 'ViewPort3D', così come' Window' e ' Grid'. Hai provato qualche/tutte queste opzioni per vedere se fa la differenza? Mi sembra possibile che lo stesso ImageBrush non esegua effettivamente il ridimensionamento in uno scenario 3D e pertanto l'impostazione di RenderOptions sull'oggetto pennello non avrà l'effetto desiderato. –

+0

Grazie per la risposta. In effetti ho provato tutte queste varianti di uno e persino insieme. Il risultato è lo stesso ((( – user1662530

+0

Ah - quindi fuori dalle idee!) La mia ipotesi è che il rendering venga eseguito dall'hardware 3D nella scheda grafica, su cui apparentemente WPF ha meno controllo di quello che potrebbe piacere. indovina, però, e non ho idea di come e se sia possibile ignorarlo se è così. Lunga ripresa, ma i driver della tua scheda video sono aggiornati? –

risposta

1

provare il seguente approccio usando VisualBrush - produce chiaro, texturing alias:

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> 

Problemi correlati