游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2890|回复: 1

发问:我想用C#+DirectX弄一个有颜色的静止三角形

[复制链接]

2

主题

5

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2009-11-4 20:21:00 | 显示全部楼层 |阅读模式


大家帮帮忙
我想用DIRECT3D+C#做一个有颜色的静止三角形。但是调试只出现个蓝屏,我找不到原因,希望大家能帮忙。

form1.cs的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace Triangle_VertexBuffer_
{
    public partial class Form1 : Form
    {

        VertexBuffer vertexBuffer = null;

        #region 数组变量
        CustomVertex.TransformedColored[] verts;
        #endregion

        public Form1()
        {

            InitializeComponent();
        }

        bool pause = false;

        private Device device = null;

        private void Form1_Resize(object sender, EventArgs e)
        {
            pause = ((this.WindowState == FormWindowState.Minimized) || !this.Visible);
        }

        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)
        {
         
            verts = (CustomVertex.TransformedColored[])vertexBuffer.Lock(0,0);
            verts[0].X = 150;
            verts[0].Y = 50;
            verts[0].Z = 0.5f;
            verts[0].Rhw = 1;
            verts[0].Color = System.Drawing.Color.Aqua.ToArgb();
            verts[1].X = 250;
            verts[1].Y = 250;
            verts[1].Z = 0.5f;
            verts[1].Rhw = 1;
            verts[1].Color = System.Drawing.Color.Brown.ToArgb();
            verts[2].X = 50;
            verts[2].Y = 250;
            verts[2].Z = 0.5f;
            verts[2].Rhw = 1;
            verts[2].Color = System.Drawing.Color.LightPink.ToArgb();
            vertexBuffer.Unlock();
        }
        

        public void OnResetDevice(object sender, EventArgs e)
        {

        }


        public bool InitializeGraphics()
        {
            try
            {
                PresentParameters presentParams = new PresentParameters();
                presentParams.Windowed = true;
                presentParams.SwapEffect = SwapEffect.Discard;
                presentParams.EnableAutoDepthStencil = true;
                presentParams.AutoDepthStencilFormat = DepthFormat.D16;
                device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
                device.DeviceReset += new System.EventHandler(this.OnResetDevice);
                this.OnCreateDevice(device, null);
                this.OnResetDevice(device, null);

            }
            catch (DirectXException)
            {
                return false;
            }
            return true;
        }

        public void Render()
        {
            if (device == null)
            {
                return;
            }
            if (pause)
            {
                return;
            }
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue, 1.0f, 0);
            device.BeginScene();
            device.SetStreamSource(0,vertexBuffer,0);
            device.VertexFormat = CustomVertex.TransformedColored.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleList,0,1);
            device.EndScene();
            device.Present();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            this.Render();
        }


    }
}
******************************************************************************
form1.cs的代码
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Triangle_VertexBuffer_
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            using (Form1 frm = new Form1())
            {
                if (!frm.InitializeGraphics())
                {
                    MessageBox.Show("不能初始化Direct 3D,退出!");
                    return;
                }
                frm.Show();
                while (frm.Created)
                {
                    frm.Render();
                    Application.DoEvents();
                }
            }
        }
    }
}
**************************************************************
program.cs的代码
引用了
Microsoft.DirectX  和
Microsoft.DirectX.Direct3D

[em7] [em7] [em7] [em7]

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-2-13 18:27:00 | 显示全部楼层

Re:发问:我想用C#+DirectX弄一个有颜色的静止三角形

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace MyFirstTriangle
{
        public class MainClass : Form
        {
                // 渲染设备定义
                Device device = null;
                CustomVertex.TransformedColored[] vertexes = null;
                int screenwidth = 640;
                int screenheight = 480;
               
                public MainClass()
                {
                        this.ClientSize = new System.Drawing.Size(640, 480);
                        this.Text = "My First Triangle";
                }
               
                public void InitializeGeometry() {
                        vertexes = new CustomVertex.TransformedColored[3];
                        // 上面的顶点:
                        vertexes[0].X = screenwidth / 2.0f; // 屏幕的一半
                        vertexes[0].Y = screenheight / 3.0f; // 屏幕的 1/3
                        vertexes[0].Z = 0.0f;
                        vertexes[0].Color = Color.Red.ToArgb();
                        // 左面的顶点:
                        vertexes[1].X = (screenwidth / 3.0f) * 2.0f; // 屏幕的 2/3
                        vertexes[1].Y = (screenheight / 3.0f) * 2.0f; // 屏幕的 2/3
                        vertexes[1].Z = 0.0f;
                        vertexes[1].Color = Color.Green.ToArgb();
                        // 右面的顶点:
                        vertexes[2].X = screenwidth / 3.0f; // 屏幕的 1/3
                        vertexes[2].Y = (screenheight / 3.0f) * 2.0f; // 屏幕的 2/3
                        vertexes[2].Z = 0.0f;
                        vertexes[2].Color = Color.Blue.ToArgb();
                }
               
                public void InitializeGraphics()
                {
                        PresentParameters presentParams = new PresentParameters();
                        presentParams.Windowed   = true;
                        presentParams.SwapEffect = SwapEffect.Discard;
                       
                        // 建立设备
                        device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
                       
                        // 建立事件入口
                        device.DeviceLost     += new EventHandler(this.InvalidateDeviceObjects);
                        device.DeviceReset    += new EventHandler(this.RestoreDeviceObjects);
                        device.Disposing      += new EventHandler(this.DeleteDeviceObjects);
                        device.DeviceResizing += new CancelEventHandler(this.EnvironmentResizing);
                        device.RenderState.CullMode = Cull.None;
                }
               
                protected virtual void InvalidateDeviceObjects(object sender, EventArgs e)
                {
                }
               
                protected virtual void RestoreDeviceObjects(object sender, EventArgs e)
                {
                }
               
                protected virtual void DeleteDeviceObjects(object sender, EventArgs e)
                {
                }
               
                protected virtual void EnvironmentResizing(object sender, CancelEventArgs e)
                {
                }
               
                // 场景移动
                protected virtual void FrameMove()
                {
                        // TODO : 帧移动
                }
               
                // 渲染场景
                protected virtual void Render()
                {
                        if (device != null) {
                                device.Clear(ClearFlags.Target, Color.Black, 1.0f, 0);
                                device.BeginScene();
                               
                                device.VertexFormat = CustomVertex.TransformedColored.Format;
                                device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertexes);
                               
                                device.EndScene();
                                device.Present();
                        }
                }
               
                // 主循环
                public void Run()
                {
                        while (Created) {
                                FrameMove();
                                Render();
                                Application.DoEvents();
                        }
                }
               
                protected override void OnPaint(PaintEventArgs e)
                {
                        this.Render();
                }
               
                protected override void OnKeyPress(KeyPressEventArgs e)
                {
                        base.OnKeyPress(e);
                        if ((int)e.KeyChar == (int)System.Windows.Forms.Keys.Escape) {
                                this.Close();
                        }
                }
               
                // 应用程序主接口
                static void Main()
                {
                        using (MainClass mainClass = new MainClass()) {
                                try {
                                        mainClass.InitializeGraphics();
                                        mainClass.InitializeGeometry();
                                        mainClass.Show();
                                        mainClass.Run();
                                }
                                catch(Exception ex) {
                                        MessageBox.Show(ex.ToString());
                                }
                        }
                }
        }
}

用这个吧,简单一点。

您的问题是DrawUserPrimitives的使用方法。
DrawUserPrimitives 应该是
(类型, 数量, 顶点集对象)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-14 12:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表