2011-07-11 61 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)); 

我也试过在点AC加入第四颜色的画笔和第4位/的TextureCoordinate完成“环绕”(那么蓝触摸绿色,环保触摸红色,红色触及蓝色),但没有奏效。 LinearGradientBrush甚至有可能吗?

回答

1

OpenGL示例基于两个角度的线性插值,因此您无法使用LinearGradientBrush执行此操作。代替这个,你可以用RadialGradientBrush的3个trianlges来模拟这个。 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> 

或者你可以创建色彩插值定制像素着色器。