2012-09-11 20 views
7

Tôi mới đến 'wpf' và tôi đã gặp vấn đề sau: Trong dự án của tôi, tôi cố gắng sử dụng độ phân giải nhỏ .png làm kết cấu cho một mô hình. Khi tôi vô hiệu hóa mipmapping trong Blender (nơi tôi đã xây dựng các khối lập phương) kết quả chỉ là những gì tôi muốn:Mipmapping in wpf

no mipmapping

Nhưng trong dự án WPF hiệu ứng mờ không bao giờ tắt:

wpf result

đây là mã của tôi:

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

Tôi đã thực hiện rất nhiều tìm kiếm trên Internet và đã thử nhiều cách tiếp cận: dựng hình phần mềm được thực thi, sử dụng DrawingBrush thay vì ImageBrush nhưng kết quả là như nhau. Có cách nào để vượt qua việc dựng hình như vậy không?

+0

Bạn đang thiết 'RenderOptions.BitmapScalingMode' mục ' ImgaeBrush'. Tôi không biết đây có phải là giải pháp (do đó một bình luận thay vì câu trả lời), nhưng bạn cũng có thể đặt nó trên 'GeometryModel3D',' ModelVisual3D' và 'ViewPort3D', cũng như' Window' và ' Lưới'. Bạn đã thử bất kỳ/tất cả các tùy chọn này để xem liệu nó có tạo sự khác biệt không? Có vẻ như có thể với tôi rằng bản thân ImageBrush không thực sự làm việc mở rộng trong một kịch bản 3D và do đó thiết lập RenderOptions trên đối tượng cọ vẽ sẽ không có hiệu ứng mong muốn. –

+0

Cảm ơn bạn đã trả lời. Trong thực tế, tôi đã thử tất cả các biến thể của một và thậm chí với nhau. Kết quả là như nhau ((( – user1662530

+0

Ah - ra khỏi ý tưởng sau đó! Tôi đoán là rendering đang được thực hiện bởi phần cứng 3D trong card đồ họa của bạn, mà WPF dường như có ít kiểm soát hơn chúng ta có thể thích. đoán, mặc dù và tôi không có ý tưởng làm thế nào hoặc thậm chí cho dù nó có thể ghi đè lên nó nếu đó là trường hợp. Long shot, nhưng trình điều khiển card video của bạn được cập nhật? –

Trả lời

1

Hãy thử phương pháp sau đây sử dụng VisualBrush - nó tạo ra rõ ràng, texturing aliased:

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>