• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C++ Programmer's Cookbook

            {C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

            紋理+VertexElement(二)

            代碼:
            //------------------------------------------------------------------------------
            //           Name: dx9cs_multiple_vertex_buffers.cs
            //         Author: Kevin Harris
            //  Last Modified: 06/15/05
            //    Description: This sample demonstrates how to create 3D geometry with 
            //                 Direct3D by loading vertex data into a multiple Vertex 
            //                 Buffers.
            //------------------------------------------------------------------------------

            using System;
            using System.Drawing;
            using System.Windows.Forms;
            using Microsoft.DirectX;
            using Microsoft.DirectX.Direct3D;

            namespace DX9Sample
            {
                
            public class DX9Form : System.Windows.Forms.Form
                
            {
                    
            private Device d3dDevice = null;
                    
            private bool mousing = false;
                    
            private Point ptLastMousePosit;
                    
            private Point ptCurrentMousePosit;
                    
            private int spinX;
                    
            private int spinY;
                    
            private VertexBuffer vertexBuffer = null//頂點
                    private VertexBuffer colorBuffer = null;  //頂點顏色
                    private VertexBuffer texCoordBuffer = null//紋理
                    Texture texture = null;

                    
            static private float elapsedTime;
                    
            static private DateTime currentTime;
                    
            static private DateTime lastTime;
                  
                    
            struct Vertex
                    
            {
                        
            float x, y, z;

                        
            public Vertex( float _x, float _y, float _z )
                        
            {
                            x 
            = _x;
                            y 
            = _y;
                            z 
            = _z;
                        }

                    }
            ;//頂點結構

                    Vertex[] cubeVertices 
            =
                    
            {
                        
            new Vertex(-1.0f1.0f,-1.0f ),
                        
            new Vertex( 1.0f1.0f,-1.0f ),
                        
            new Vertex(-1.0f,-1.0f,-1.0f ),
                        
            new Vertex( 1.0f,-1.0f,-1.0f ),

                        
            new Vertex(-1.0f1.0f1.0f ),
                        
            new Vertex(-1.0f,-1.0f1.0f ),
                        
            new Vertex( 1.0f1.0f1.0f ),
                        
            new Vertex( 1.0f,-1.0f1.0f ),

                        
            new Vertex(-1.0f1.0f1.0f ),
                        
            new Vertex( 1.0f1.0f1.0f ),
                        
            new Vertex(-1.0f1.0f,-1.0f ),
                        
            new Vertex( 1.0f1.0f,-1.0f ),

                        
            new Vertex(-1.0f,-1.0f1.0f ),
                        
            new Vertex(-1.0f,-1.0f,-1.0f ),
                        
            new Vertex( 1.0f,-1.0f1.0f ),
                        
            new Vertex( 1.0f,-1.0f,-1.0f ),

                        
            new Vertex( 1.0f1.0f,-1.0f ),
                        
            new Vertex( 1.0f1.0f1.0f ),
                        
            new Vertex( 1.0f,-1.0f,-1.0f ),
                        
            new Vertex( 1.0f,-1.0f1.0f ),

                        
            new Vertex(-1.0f1.0f,-1.0f ),
                        
            new Vertex(-1.0f,-1.0f,-1.0f ),
                        
            new Vertex(-1.0f1.0f1.0f ),
                        
            new Vertex(-1.0f,-1.0f1.0f )
                    }
            ;

                    
            struct DiffuseColor
                    
            {
                        
            int color;

                        
            public DiffuseColor( int _color )
                        
            {
                           color 
            = _color;
                        }

                    }
            ;//顏色結構

                    DiffuseColor[] cubeColors 
            =
                    
            {
                        
            new DiffuseColor( Color.Red.ToArgb() ),
                        
            new DiffuseColor( Color.Red.ToArgb() ),
                        
            new DiffuseColor( Color.Red.ToArgb() ),
                        
            new DiffuseColor( Color.Red.ToArgb() ),

                        
            new DiffuseColor( Color.Green.ToArgb() ),
                        
            new DiffuseColor( Color.Green.ToArgb() ),
                        
            new DiffuseColor( Color.Green.ToArgb() ),
                        
            new DiffuseColor( Color.Green.ToArgb() ),

                        
            new DiffuseColor( Color.Blue.ToArgb() ),
                        
            new DiffuseColor( Color.Blue.ToArgb() ),
                        
            new DiffuseColor( Color.Blue.ToArgb() ),
                        
            new DiffuseColor( Color.Blue.ToArgb() ),

                        
            new DiffuseColor( Color.Yellow.ToArgb() ),
                        
            new DiffuseColor( Color.Yellow.ToArgb() ),
                        
            new DiffuseColor( Color.Yellow.ToArgb() ),
                        
            new DiffuseColor( Color.Yellow.ToArgb() ),

                        
            new DiffuseColor( Color.Magenta.ToArgb() ),
                        
            new DiffuseColor( Color.Magenta.ToArgb() ),
                        
            new DiffuseColor( Color.Magenta.ToArgb() ),
                        
            new DiffuseColor( Color.Magenta.ToArgb() ),

                        
            new DiffuseColor( Color.Cyan.ToArgb() ),
                        
            new DiffuseColor( Color.Cyan.ToArgb() ),
                        
            new DiffuseColor( Color.Cyan.ToArgb() ),
                        
            new DiffuseColor( Color.Cyan.ToArgb() )
                    }
            ;

                    
            struct TexCoord
                    
            {
                        
            float tu, tv;

                        
            public TexCoord( float _tu, float _tv )
                        
            {
                            tu 
            = _tu;
                            tv 
            = _tv;
                        }

                    }
            ;//紋理結構

                    TexCoord[] cubeTexCoords 
            =
                    
            {
                        
            new TexCoord( 0.0f0.0f ),
                        
            new TexCoord( 1.0f0.0f ),
                        
            new TexCoord( 0.0f1.0f ),
                        
            new TexCoord( 1.0f1.0f ),

                        
            new TexCoord( 1.0f0.0f ),
                        
            new TexCoord( 1.0f1.0f ),
                        
            new TexCoord( 0.0f0.0f ),
                        
            new TexCoord( 0.0f1.0f ),

                        
            new TexCoord( 0.0f0.0f ),
                        
            new TexCoord( 1.0f0.0f ),
                        
            new TexCoord( 0.0f1.0f ),
                        
            new TexCoord( 1.0f1.0f ),

                        
            new TexCoord( 0.0f0.0f ),
                        
            new TexCoord( 1.0f0.0f ),
                        
            new TexCoord( 0.0f1.0f ),
                        
            new TexCoord( 1.0f1.0f ),

                        
            new TexCoord( 0.0f0.0f ),
                        
            new TexCoord( 1.0f0.0f ),
                        
            new TexCoord( 0.0f1.0f ),
                        
            new TexCoord( 1.0f1.0f ),

                        
            new TexCoord( 1.0f0.0f ),
                        
            new TexCoord( 1.0f1.0f ),
                        
            new TexCoord( 0.0f0.0f ),
                        
            new TexCoord( 0.0f1.0f )
                    }
            ;

                    
            public DX9Form()
                    
            {
                        
            this.ClientSize = new Size( 640480 );
                        
            this.Text = "Direct3D (DX9/C#) - Multiple Vertex Buffers";
                        
            this.SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true );
                    }


                    
            protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
                    
            {
                        currentTime 
            = DateTime.Now;
                        TimeSpan elapsedTimeSpan 
            = currentTime.Subtract( lastTime );
                        elapsedTime 
            = (float)elapsedTimeSpan.Milliseconds * 0.001f;
                        lastTime 
            = currentTime;

                        
            this.Render();
                        
            this.Invalidate();
                    }


                    
            protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
                    
            {
                        
            switch( e.KeyCode )
                        
            {
                            
            case System.Windows.Forms.Keys.Escape:
                                
            this.Dispose();
                                
            break;
                        }

                    }


                    
            protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
                    
            {
                        ptLastMousePosit 
            = ptCurrentMousePosit = PointToScreen( new Point(e.X, e.Y) );
                        mousing 
            = true;
                    }


                    
            protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
                    
            {
                        mousing 
            = false;
                    }


                    
            protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e)
                    
            {
                        ptCurrentMousePosit 
            = PointToScreen( new Point(e.X, e.Y) );

                        
            if( mousing )
                        
            {
                            spinX 
            -= (ptCurrentMousePosit.X - ptLastMousePosit.X);
                            spinY 
            -= (ptCurrentMousePosit.Y - ptLastMousePosit.Y);
                        }

                        
                        ptLastMousePosit 
            = ptCurrentMousePosit;
                    }


                    
            protected override void Dispose(bool disposing)
                    
            {
                        
            base.Dispose( disposing );
                    }


                    
            static void Main() 
                    
            {
                        
            using( DX9Form frm = new DX9Form() )
                        
            {
                            frm.Show();
                            frm.Init();
                            Application.Run( frm );
                        }

                    }


                    
            private void LoadTexture()
                    
            {//load 紋理
                        try
                        
            {
                            Bitmap testImage 
            = (Bitmap)Bitmap.FromFile( "test.bmp" );
                            texture 
            = Texture.FromBitmap( d3dDevice, testImage, 0, Pool.Managed );
                        }

                        
            catch
                        
            {
                            
            // We must be running from within Visual Studio. Relocate the 
                            
            // current directory and try again.
                            System.IO.Directory.SetCurrentDirectory(
                                System.Windows.Forms.Application.StartupPath 
            +  @"\..\..\");

                            Bitmap testImage 
            = (Bitmap)Bitmap.FromFile( "test.bmp" );
                            texture 
            = Texture.FromBitmap( d3dDevice, testImage, 0, Pool.Managed );
                        }


                        d3dDevice.SamplerState[
            0].MinFilter = TextureFilter.Linear;
                        d3dDevice.SamplerState[
            0].MagFilter = TextureFilter.Linear;
                    }



                    
            /// <summary>
                    
            /// This method basically creates and initialize the Direct3D device and
                    
            /// anything else that doens't need to be recreated after a device 
                    
            /// reset.
                    
            /// </summary>

                    private void Init()
                    
            {
                        
            //
                        
            // Do we support hardware vertex processing? If so, use it. 
                        
            // If not, downgrade to software.
                        
            //

                        Caps caps 
            = Manager.GetDeviceCaps( Manager.Adapters.Default.Adapter, 
                                                           DeviceType.Hardware );
                        CreateFlags flags;

                        
            if( caps.DeviceCaps.SupportsHardwareTransformAndLight )
                            flags 
            = CreateFlags.HardwareVertexProcessing;
                        
            else
                            flags 
            = CreateFlags.SoftwareVertexProcessing;

                        
            //
                        
            // Everything checks out - create a simple, windowed device.
                        
            //

                        PresentParameters d3dpp 
            = new PresentParameters();

                        d3dpp.BackBufferFormat       
            = Format.Unknown;
                        d3dpp.SwapEffect             
            = SwapEffect.Discard;
                        d3dpp.Windowed               
            = true;
                        d3dpp.EnableAutoDepthStencil 
            = true;
                        d3dpp.AutoDepthStencilFormat 
            = DepthFormat.D16;
                        d3dpp.PresentationInterval   
            = PresentInterval.Immediate; 

                        d3dDevice 
            = new Device( 0, DeviceType.Hardware, this, flags, d3dpp );

                        
            // Register an event-handler for DeviceReset and call it to continue
                        
            // our setup.
                        d3dDevice.DeviceReset += new System.EventHandler( this.OnResetDevice );
                        OnResetDevice( d3dDevice, 
            null );
                    }


                    
            /// <summary>
                    
            /// This event-handler is a good place to create and initialize any 
                    
            /// Direct3D related objects, which may become invalid during a 
                    
            /// device reset.
                    
            /// </summary>

                    public void OnResetDevice(object sender, EventArgs e)
                    
            {
                        Device device 
            = (Device)sender;
                        device.Transform.Projection 
            = 
                            Matrix.PerspectiveFovLH( Geometry.DegreeToRadian( 
            45.0f ),
                            (
            float)this.ClientSize.Width / this.ClientSize.Height,
                            
            0.1f100.0f );

                        device.RenderState.ZBufferEnable 
            = true;
                        device.RenderState.Lighting 
            = false;

                        
            //
                        
            // Create a vertex buffer that contains only the cube's vertex data
                        
            //

                        vertexBuffer 
            = new VertexBuffer( typeof(Vertex),
                                                         cubeVertices.Length, device,
                                                         Usage.Dynamic 
            | Usage.WriteOnly,
                                                         VertexFormats.Position,
                                                         Pool.Default );

                        GraphicsStream gStream 
            = vertexBuffer.Lock( 00, LockFlags.None );

                        
            // Now, copy the vertex data into the vertex buffer
                        gStream.Write( cubeVertices );

                        vertexBuffer.Unlock();

                        
            //
                        
            // Create a vertex buffer that contains only the cube's color data
                        
            //

                        colorBuffer 
            = new VertexBuffer( typeof(DiffuseColor),
                                                        cubeVertices.Length, device,
                                                        Usage.Dynamic 
            | Usage.WriteOnly,
                                                        VertexFormats.Diffuse,
                                                        Pool.Default );

                        gStream 
            = null;
                        gStream 
            = colorBuffer.Lock( 00, LockFlags.None );

                        
            // Now, copy the vertex data into the vertex buffer
                        gStream.Write( cubeColors );

                        colorBuffer.Unlock();

                        
            //
                        
            // Create a vertex buffer that contains only the cube's texture coordinate data
                        
            //

                        texCoordBuffer 
            = new VertexBuffer( typeof(TexCoord),
                                                           cubeVertices.Length, device,
                                                           Usage.Dynamic 
            | Usage.WriteOnly,
                                                           VertexFormats.Texture1,
                                                           Pool.Default );

                        gStream 
            = null;
                        gStream 
            = texCoordBuffer.Lock( 00, LockFlags.None );

                        
            // Now, copy the vertex data into the vertex buffer
                        gStream.Write( cubeTexCoords );

                        texCoordBuffer.Unlock();

                        
            //
                        
            // Create a vertex declaration so we can describe to Direct3D how we'll 
                        
            // be passing our data to it.
                        
            //

                        
            // Create the vertex element array.
                        VertexElement[] elements = new VertexElement[]
                        
            {
                            
            //                Stream  Offset        Type                    Method                 Usage                      Usage Index
                            new VertexElement( 0,     0,  DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Position,          0),
                            
            new VertexElement( 1,     0,  DeclarationType.Color,  DeclarationMethod.Default, DeclarationUsage.Color,             0),
                            
            new VertexElement( 2,     0,  DeclarationType.Float2, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0),

                            VertexElement.VertexDeclarationEnd 
                        }
            ;

                        
            // Use the vertex element array to create a vertex declaration.
                        d3dDevice.VertexDeclaration = new VertexDeclaration( d3dDevice, elements );

                        LoadTexture();
                    }


                    
            /// <summary>
                    
            /// This method is dedicated completely to rendering our 3D scene and is
                    
            /// is called by the OnPaint() event-handler.
                    
            /// </summary>

                    private void Render()
                    
            {
                        d3dDevice.Clear( ClearFlags.Target 
            | ClearFlags.ZBuffer, 
                                         Color.FromArgb(
            255000), 1.0f0 );

                        d3dDevice.BeginScene();

                        d3dDevice.Transform.World 
            = 
                            Matrix.RotationYawPitchRoll( Geometry.DegreeToRadian(spinX),
                            Geometry.DegreeToRadian(spinY), 
            0.0f* 
                            Matrix.Translation(
            0.0f0.0f5.0f);

                        d3dDevice.SetStreamSource( 
            0, vertexBuffer,   0 );
                        d3dDevice.SetStreamSource( 
            1, colorBuffer,    0 );
                        d3dDevice.SetStreamSource( 
            2, texCoordBuffer, 0 );

                        d3dDevice.SetTexture( 
            0, texture );

                        d3dDevice.DrawPrimitives( PrimitiveType.TriangleStrip,  
            02 );
                        d3dDevice.DrawPrimitives( PrimitiveType.TriangleStrip,  
            42 );
                        d3dDevice.DrawPrimitives( PrimitiveType.TriangleStrip,  
            82 );
                        d3dDevice.DrawPrimitives( PrimitiveType.TriangleStrip, 
            122 );
                        d3dDevice.DrawPrimitives( PrimitiveType.TriangleStrip, 
            162 );
                        d3dDevice.DrawPrimitives( PrimitiveType.TriangleStrip, 
            202 );

                        d3dDevice.EndScene();

                        d3dDevice.Present();
                    }

                }

            }

            posted on 2007-11-09 18:01 夢在天涯 閱讀(1735) 評論(0)  編輯 收藏 引用 所屬分類: DirectX

            公告

            EMail:itech001#126.com

            導航

            統(tǒng)計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1807577
            • 排名 - 5

            最新評論

            閱讀排行榜

            午夜人妻久久久久久久久| 亚洲精品第一综合99久久| 精品综合久久久久久97| 久久国产免费直播| 久久国产精品成人影院| 国产69精品久久久久99尤物| 久久国产精品偷99| 91精品婷婷国产综合久久| 久久人人爽人人爽人人片av麻烦| 久久久久久午夜成人影院 | 天天做夜夜做久久做狠狠| 国内精品久久久久久久97牛牛| 久久毛片免费看一区二区三区| 久久精品国产99国产电影网| 亚洲愉拍99热成人精品热久久| 亚洲午夜无码AV毛片久久| 久久国产精品偷99| 久久99热只有频精品8| 热久久视久久精品18| 国产午夜精品久久久久九九电影| 无码伊人66久久大杳蕉网站谷歌 | 欧美噜噜久久久XXX| 久久久久亚洲av综合波多野结衣| 久久免费精品一区二区| 一本一道久久精品综合| 亚洲国产精品无码久久| 伊人久久大香线蕉亚洲五月天| 久久久久久极精品久久久 | 久久九九久精品国产| 热久久国产精品| 99久久精品九九亚洲精品| 久久国产精品99久久久久久老狼 | 亚洲午夜久久久久妓女影院| 四虎久久影院| 伊人久久无码精品中文字幕| 久久久久国产视频电影| 久久影院久久香蕉国产线看观看| 精品久久久久久无码人妻蜜桃| 国产高潮久久免费观看| 久久青青草原精品国产软件| 国产精品久久久久蜜芽|