游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2274|回复: 4

C# 下用texture quad实现2D的问题(附件中是完整工程)

[复制链接]

8

主题

28

帖子

43

积分

注册会员

Rank: 2

积分
43
发表于 2004-8-9 21:10:00 | 显示全部楼层 |阅读模式
#region Using directives

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



#endregion

namespace d3dimage
{
    partial class Form1 : Form
    {
        Device device = null;
        VertexBuffer backgroundVB = null;
        Texture backImage = null;

        int windowWidth = 1024;
        int windowHeight = 768;

        public Form1()
        {
            InitializeComponent();

            this.ClientSize = new Size(1024, 768);

            InitializeGraphics();
        }

        private void OnDeviceReset(Object sender, EventArgs e)
        {
            Device dev = (Device)sender;

            backgroundVB = new VertexBuffer(typeof(CustomVertex.PositionTextured), 4, dev, Usage.None, CustomVertex.PositionTextured.Format, Pool.Managed);
            backgroundVB.Created += new EventHandler(this.OnCreateVertexBuffer);

            dev.SetStreamSource(0, backgroundVB, 0);

            this.OnCreateVertexBuffer((object)backgroundVB, null);
        }

        public void OnDeviceLost(object sender, EventArgs e)
        {
            backgroundVB.Dispose();
            backImage.Dispose();
        }

        public void OnCreateVertexBuffer(object sender, EventArgs e)
        {
            VertexBuffer vb = (VertexBuffer)sender;
            float w;
            float h;

            w = (float)backImage.GetLevelDescription(0).Width;
            h = (float)backImage.GetLevelDescription(0).Height;

            CustomVertex.PositionTextured[] vertices = new CustomVertex.PositionTextured[4];

            vertices[0].X = 0.0f;
            vertices[0].Y = 0.0f;
            vertices[0].Z = 0.0f;
            vertices[0].Tu = 0.0f;
            vertices[0].Tv = 0.0f;

            vertices[1].X = w;
            vertices[1].Y = 0.0f;
            vertices[1].Z = 0.0f;
            vertices[1].Tu = 1.0f;
            vertices[1].Tv = 0.0f;

            vertices[2].X = w;
            vertices[2].Y = h;
            vertices[2].Z = 0.0f;
            vertices[2].Tu = 1.0f;
            vertices[2].Tv = 1.0f;

            vertices[3].X = 0.0f;
            vertices[3].Y = h;
            vertices[3].Z = 0.0f;
            vertices[3].Tu = 0.0f;
            vertices[3].Tv = 1.0f;

            GraphicsStream stm = vb.Lock(0, 0, 0);
            stm.Write(vertices);
            vb.Unlock();
        }

        private bool InitializeGraphics()
        {
            try
            {
                PresentParameters presentParams = new PresentParameters();
                presentParams.Windowed = true;
                presentParams.SwapEffect = SwapEffect.Discard;
                presentParams.BackBufferWidth = 1024;
                presentParams.BackBufferHeight = 768;
                presentParams.BackBufferCount = 1;
                presentParams.BackBufferFormat = Format.A8R8G8B8;

                device = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, presentParams);
               
                device.DeviceReset += new EventHandler(this.OnDeviceReset);
                device.DeviceLost += new EventHandler(this.OnDeviceLost);

                backImage = TextureLoader.FromFile(device, @"g:\WallPapers\wall_1280_4.jpg");

                this.OnDeviceReset(device, null);

                return true;
            }
            catch (DirectXException e)
            {
                Trace.WriteLine(e.ErrorString);

                return false;
            }
        }

        public void Render()
        {
            if (device == null)
            {
                return;
            }

            //Clear the backbuffer to a blue color (ARGB = 000000ff)
            device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);


            //Begin the scene
            device.BeginScene();

            device.SetStreamSource(0, backgroundVB, 0);
            device.SetTexture(0, backImage);

            device.VertexFormat = CustomVertex.PositionTextured.Format;
            device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 2);

            //End the scene
            device.EndScene();

            device.Present();
        }

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

        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((int)(byte)e.KeyChar == (int)System.Windows.Forms.Keys.Escape)
            {
                this.Close(); // Esc was pressed
            }
        }

    }
}

sf_200489211055.rar

10.85 KB, 下载次数:

8

主题

28

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2004-8-9 21:17:00 | 显示全部楼层

Re: C# 下用texture quad实现2D的问题,救救我啊(附件中是完

问题是,执行后只显示白色的窗口,并没有显示图像出来。怎么回事啊。
郁闷。新手,请多帮助。

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2004-8-9 23:46:00 | 显示全部楼层

Re:C# 下用texture quad实现2D的问题,救救我啊(附件中是完

因为你使用的未经T&L处理的顶点,所以需要设置worldMatrix,projectionMatrix,viewMatrix,还有你的顶点的Z值为0,将它设为一个大于你的projectionMatrix中near plane的值,另外,你的第三个顶点和第四个顶点的贴图坐标应该交换一下吧!如果还有问题,将lighting关闭。

8

主题

28

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2004-8-10 15:22:00 | 显示全部楼层

Re: C# 下用texture quad实现2D的问题(附件中是完整工程)

哈哈,基本解决了问题。显示不出来是因为backface culling的问题。

把Y轴搞错了,逆向的三角形不被显示。

修改后的代码:

#region Using directives

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



#endregion

namespace d3dimage
{
    partial class Form1 : Form
    {
        Device device = null;
        VertexBuffer backgroundVB = null;
        Texture backImage = null;

        int windowWidth = 1024;
        int windowHeight = 768;

        public Form1()
        {
            InitializeComponent();

            this.ClientSize = new Size(1024, 768);

            InitializeGraphics();
        }

        private void OnDeviceReset(Object sender, EventArgs e)
        {
            Device dev = (Device)sender;

            backgroundVB = new VertexBuffer(typeof(CustomVertex.PositionTextured), 4, dev, Usage.None, CustomVertex.PositionTextured.Format, Pool.Managed);
            backgroundVB.Created += new EventHandler(this.OnCreateVertexBuffer);

            dev.SetStreamSource(0, backgroundVB, 0);

            dev.RenderState.Lighting = false;
            dev.RenderState.AlphaBlendEnable = true;
            dev.RenderState.SourceBlend = Blend.SourceAlpha;
            dev.RenderState.DestinationBlend = Blend.InvSourceAlpha;
            dev.SetTextureStageState(0, TextureStageStates.AlphaOperation, true);

            this.OnCreateVertexBuffer((object)backgroundVB, null);
        }

        public void OnDeviceLost(object sender, EventArgs e)
        {
            backgroundVB.Dispose();
            backImage.Dispose();
        }

        public void OnCreateVertexBuffer(object sender, EventArgs e)
        {
            VertexBuffer vb = (VertexBuffer)sender;

            CustomVertex.PositionTextured[] vertices = new CustomVertex.PositionTextured[4];

            vertices[0].X = -1.0f;
            vertices[0].Y = 1.0f;
            vertices[0].Z = 1.0f;
            vertices[0].Tu = 0.0f;
            vertices[0].Tv = 0.0f;

            vertices[1].X = 1.0f;
            vertices[1].Y = 1.0f;
            vertices[1].Z = 1.0f;
            vertices[1].Tu = 1.0f;
            vertices[1].Tv = 0.0f;

            vertices[2].X = 1.0f;
            vertices[2].Y = -1.0f;
            vertices[2].Z = 1.0f;
            vertices[2].Tu = 1.0f;
            vertices[2].Tv = 1.0f;

            vertices[3].X = -1.0f;
            vertices[3].Y = -1.0f;
            vertices[3].Z = 1.0f;
            vertices[3].Tu = 0.0f;
            vertices[3].Tv = 1.0f;

            GraphicsStream stm = vb.Lock(0, 0, 0);
            stm.Write(vertices);
            vb.Unlock();
        }

        private bool InitializeGraphics()
        {
            try
            {
                PresentParameters presentParams = new PresentParameters();
                presentParams.Windowed = true;
                presentParams.SwapEffect = SwapEffect.Discard;
                presentParams.BackBufferWidth = 1024;
                presentParams.BackBufferHeight = 768;
                presentParams.BackBufferCount = 1;
                presentParams.BackBufferFormat = Format.A8R8G8B8;
                presentParams.PresentationInterval = PresentInterval.Immediate;
                presentParams.PresentFlag = PresentFlag.None;

                device = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, presentParams);

                device.VertexShader = null;
               
                device.DeviceReset += new EventHandler(this.OnDeviceReset);
                device.DeviceLost += new EventHandler(this.OnDeviceLost);

                backImage = TextureLoader.FromFile(device, @"g:\WallPapers\wall_1280_4.jpg");

                this.OnDeviceReset(device, null);

                return true;
            }
            catch (DirectXException e)
            {
                Trace.WriteLine(e.ErrorString);

                return false;
            }
        }

        public void Render()
        {
            if (device == null)
            {
                return;
            }

            //Clear the backbuffer to a blue color (ARGB = 000000ff)
            device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);


            //Begin the scene
            device.BeginScene();

            device.SetStreamSource(0, backgroundVB, 0);
            device.SetTexture(0, backImage);
            
            device.VertexFormat = CustomVertex.PositionTextured.Format;
            device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 2);

            //End the scene
            device.EndScene();

            device.Present();
        }

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

        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((int)(byte)e.KeyChar == (int)System.Windows.Forms.Keys.Escape)
            {
                this.Close(); // Esc was pressed
            }
        }

    }
}

8

主题

28

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2004-8-10 15:26:00 | 显示全部楼层

Re: C# 下用texture quad实现2D的问题(附件中是完整工程)

但还是有有些问题,在这种情况下使用的是什么坐标系?

还有,显示出来的图片为什么自动伸缩了。

还请高手相助。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-16 13:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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