|

楼主 |
发表于 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
}
}
}
} |
|