Why Can I only see Red Color when drawing three points which have three colors?
CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[3];
verts[0].X=150;verts[0].Y=50;verts[0].Z=0.5f;verts[0].Color=Color.Red.ToArgb();
verts[1].X=250;verts[1].Y=250;verts[1].Z=0.5f;verts[1].Color=Color.Yellow.ToArgb();
verts[2].X=50;verts[2].Y=250;verts[2].Z=0.5f; verts[2].Color =Color.Green.ToArgb();
device.SetRenderState(RenderStates.ShadeMode,2);
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
Someone Please tell me?
[504 byte] By [
hackbabu] at [2007-12-23]
This code snippets looks fine. You need to provide a little bit more of your code as the problem seams to be elsewhere.
Have you modified any other states?
Have you set the right FVF?
This is my All code.
Device device = null;
VertexBuffer vertexBuffer = null;
public bool Initialize()
{
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed=true;
presentParams.SwapEffect = SwapEffect.Discard;
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
this.OnCreateDevice(device, null);
return true;
}
public void OnCreateDevice(object sender, EventArgs e)
{
Device dev = (Device)sender;
vertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored), 3, dev, 0, CustomVertex.TransformedColored.Format, Pool.Default);
vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer);
this.OnCreateVertexBuffer(vertexBuffer, null);
}
public void OnCreateVertexBuffer(object sender, EventArgs e)
{
Console.WriteLine("Call!!");
VertexBuffer vb = (VertexBuffer)sender;
GraphicsStream stm = vb.Lock(0, 0, 0);
CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[3];
verts[0].X=150;verts[0].Y=50;verts[0].Z=0.5f; verts[0].Color = System.Drawing.Color.Red.ToArgb();
verts[1].X=150;verts[1].Y=150;verts[1].Z=0.5f; verts[1].Color = System.Drawing.Color.Yellow.ToArgb();
verts[2].X=50;verts[2].Y=50;verts[2].Z=0.5f; verts[2].Color = System.Drawing.Color.Green.ToArgb();
stm.Write(verts);
vb.Unlock();
}
private void Render()
{
if (device == null) {return;}
device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);
device.BeginScene();
device.SetStreamSource( 0, vertexBuffer, 0);
device.VertexFormat = CustomVertex.TransformedColored.Format;
device.SetRenderState(RenderStates.ShadeMode,2);
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
device.EndScene();
device.Present();
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{this.Render(); }
And How to set FVF?Can You tell me?
FVF stands for Flexible Vertex Format.You have already set it right with device.VertexFormat.
Your code works fine on my system. Can you please tell me what graphics card you are use and make a screenshot of your Result?
If Light is ON : (and one light is defined...not a spot light but a global Light)ColorVertex=MaterialColor * (AmbientColor + Light1 +Ligth2...)
And You need to specify the ColorOp, ARG1 and ARG2
In your case you would need ColorOp to be SELECTARG1 and ARG1 to be Diffuse (ARG2 is not used)
Did you put the LIGHT on or off ?
If you have Light ON you need to define one Light...or an ambient value (a state value)
With Light OFF the Color come only from the Vertex Color Value (not the formula above)
http://www.toymaker.info/Games/html/render_states.html