2011-07-11 8 views
3

私はWPF 3Dの三角形メッシュにグラデーションテクスチャを適用しようとしています。私は、各コーナーは、古典的なOpenGLの例のように、そのそれぞれの色を「発光」であるかのように見えるように結果の三角形をしたいと思います:WPF3Dの三角勾配

Desired result http://shoefitr.com/images/desiredGradientTriangle.jpg

これは私が得ることができました最も近い:

ここで

Closest so far http://shoefitr.com/images/gradientTriangle2.png

は私がしようとしているブラシです:

var brush = new LinearGradientBrush { 
    StartPoint = new Point(0, 0), 
    EndPoint = new Point(1, 0) 
}; 

brush.GradientStops.Add(new GradientStop(Colors.Blue, 0.0)); 
brush.GradientStops.Add(new GradientStop(Colors.Green, 0.5)); 
brush.GradientStops.Add(new GradientStop(Colors.Red, 1.0)); 

そして、これが適用されテクスチャ:

var mesh = new MeshGeometry3D(); 
Point3D p1 = new Point3D(0, 0, 0); 
Point3D p2 = new Point3D(0, 5, 0); 
Point3D p3 = new Point3D(10, 0, 0); 

mesh.Positions.Add(a); 
mesh.Positions.Add(b); 
mesh.Positions.Add(c); 

// Make triangle visible from both sides 
mesh.TriangleIndices.Add(0); 
mesh.TriangleIndices.Add(1); 
mesh.TriangleIndices.Add(2); 
mesh.TriangleIndices.Add(2); 
mesh.TriangleIndices.Add(1); 
mesh.TriangleIndices.Add(0); 

mesh.TextureCoordinates.Add(new Point(0.0, 0.0)); 
mesh.TextureCoordinates.Add(new Point(0.5, 0.0)); 
mesh.TextureCoordinates.Add(new Point(1.0, 0.0)); 

私も、そう青タッチ緑(赤、赤、緑のタッチを「ラップアラウンド」を終了するブラシと点交流で4位/ TextureCoordinateに4色を追加しようとしました青に触れる)、それはうまくいかなかった。これはLinearGradientBrushでも可能ですか?

答えて

1

OpenGLの例は、2次元の線形補間に基づいているため、LinearGradientBrushで行うことはできません。この代わりに、RadialGradientBrushを使用して3つのトリアンラージュをエミュレートできます。 Triangle

<Viewport3D x:Name="viewport"> 
     <Viewport3D.Camera> 
     <PerspectiveCamera Position="0,0,2" LookDirection="0,0,-1" FieldOfView="60" /> 
     </Viewport3D.Camera> 
     <Viewport3D.Children> 
     <ModelVisual3D> 
      <ModelVisual3D.Content> 
      <DirectionalLight Color="#FFFFFF" Direction="0,0,-0.612372" /> 
      </ModelVisual3D.Content> 
     </ModelVisual3D> 
     <ModelVisual3D> 
      <ModelVisual3D.Content> 
      <GeometryModel3D> 
       <GeometryModel3D.Geometry> 
       <MeshGeometry3D 
       TriangleIndices="0,1,2 2,1,0 " 
       Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 " 
       TextureCoordinates="0,0 1,0 0,1" 
       Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0,0.5,0.5 " /> 
       </GeometryModel3D.Geometry> 
       <GeometryModel3D.Material> 
       <MaterialGroup> 
        <DiffuseMaterial Brush="Black"/> 
       </MaterialGroup> 
       </GeometryModel3D.Material> 
      </GeometryModel3D> 
      </ModelVisual3D.Content> 
     </ModelVisual3D> 
     <ModelVisual3D> 
      <ModelVisual3D.Content> 
      <GeometryModel3D> 
       <GeometryModel3D.Geometry> 
       <MeshGeometry3D 
       TriangleIndices="0,1,2 2,1,0 " 
       Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 " 
       TextureCoordinates="0,0 1,0 0,1" 
       Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0,0.5,0.5 " /> 
       </GeometryModel3D.Geometry> 
       <GeometryModel3D.Material> 
       <MaterialGroup> 
        <DiffuseMaterial> 
        <DiffuseMaterial.Brush> 
         <RadialGradientBrush Center="0,0" GradientOrigin="0,0" RadiusX="1" RadiusY="1"> 
         <RadialGradientBrush.GradientStops> 
          <GradientStop Color="#FFFF0000" Offset="0" /> 
          <GradientStop Color="#00FF0000" Offset="1" /> 
         </RadialGradientBrush.GradientStops> 
         </RadialGradientBrush> 
        </DiffuseMaterial.Brush> 
        </DiffuseMaterial> 
       </MaterialGroup> 
       </GeometryModel3D.Material> 
      </GeometryModel3D> 
      </ModelVisual3D.Content> 
     </ModelVisual3D> 
     <ModelVisual3D> 
      <ModelVisual3D.Content> 
      <GeometryModel3D> 
       <GeometryModel3D.Geometry> 
       <MeshGeometry3D 
       TriangleIndices="0,1,2 2,1,0 " 
       Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 " 
       TextureCoordinates="0,0 1,0 0,1" 
       Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0,0.5,0.5 " /> 
       </GeometryModel3D.Geometry> 
       <GeometryModel3D.Material> 
       <MaterialGroup> 
        <DiffuseMaterial> 
        <DiffuseMaterial.Brush> 
         <RadialGradientBrush Center="0.5,1" GradientOrigin="0.5,1" RadiusX="1" RadiusY="1"> 
         <RadialGradientBrush.GradientStops> 
          <GradientStop Color="#FF00FF00" Offset="0" /> 
          <GradientStop Color="#0000FF00" Offset="1" /> 
         </RadialGradientBrush.GradientStops> 
         </RadialGradientBrush> 
        </DiffuseMaterial.Brush> 
        </DiffuseMaterial> 
       </MaterialGroup> 
       </GeometryModel3D.Material> 
      </GeometryModel3D> 
      </ModelVisual3D.Content> 
     </ModelVisual3D> 
     <ModelVisual3D> 
      <ModelVisual3D.Content> 
      <GeometryModel3D> 
       <GeometryModel3D.Geometry> 
       <MeshGeometry3D 
       TriangleIndices="0,1,2 2,1,0 " 
       Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 " 
       TextureCoordinates="0,0 1,0 0,1" 
       Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0,0.5,0.5 " /> 
       </GeometryModel3D.Geometry> 
       <GeometryModel3D.Material> 
       <MaterialGroup> 
        <DiffuseMaterial> 
        <DiffuseMaterial.Brush> 
         <RadialGradientBrush Center="1,0" GradientOrigin="1,0" RadiusX="1" RadiusY="1"> 
         <RadialGradientBrush.GradientStops> 
          <GradientStop Color="#FF0000FF" Offset="0" /> 
          <GradientStop Color="#000000FF" Offset="1" /> 
         </RadialGradientBrush.GradientStops> 
         </RadialGradientBrush> 
        </DiffuseMaterial.Brush> 
        </DiffuseMaterial> 
       </MaterialGroup> 
       </GeometryModel3D.Material> 
      </GeometryModel3D> 
      </ModelVisual3D.Content> 
     </ModelVisual3D>       
     </Viewport3D.Children> 
</Viewport3D> 

それともできる色補間用のカスタムピクセルシェーダを作成します。