?
Solved

Problem with Texture and VertexBuffer

Posted on 2003-10-31
1
Medium Priority
?
636 Views
Last Modified: 2013-12-26
I cannot get a background file to display properly in C# DirectX9 using a Vertex Buffer, Texture and TriangleList. This is supposed to be one of the simplest operations in DirectX and I have tried everything to get an image to display. It seems to be displaying only a very small portion of the image. What am I doing wrong?

Here is the code:
----------------------------------------------------------------------------

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

/// <summary>
/// Summary description for Form.
/// </summary>
public class Form : System.Windows.Forms.Form
{
      /// <summary>
      /// Required designer variable.
      /// </summary>
      private System.ComponentModel.Container components = null;
      
      Microsoft.DirectX.Direct3D.Device device = null;
            
      PresentParameters parameters = new PresentParameters();

      bool terminate;
      
      Texture texture = null;
                  
      VertexBuffer vb;

      public Form()
      {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
                        
            // everthing happens from here
            try
            {
                  this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
                  this.MaximizeBox = false;
                  this.MinimizeBox = false;
                  this.ControlBox = false;

                  // declare useful variables
                  Microsoft.DirectX.Direct3D.Caps caps;
                  Microsoft.DirectX.Direct3D.CreateFlags flags;

                  parameters = new PresentParameters();
                  parameters.BackBufferCount = 1;
                  parameters.SwapEffect = SwapEffect.Copy;
                  parameters.PresentationInterval = PresentInterval.Immediate;
            
                  parameters.BackBufferWidth = 1024;
                  parameters.BackBufferHeight = 768;
                  parameters.BackBufferFormat = Format.X8R8G8B8;

                  // check for, and specify, depth buffer
                  if (Microsoft.DirectX.Direct3D.Manager.CheckDepthStencilMatch(0,
                        Microsoft.DirectX.Direct3D.DeviceType.Hardware,
                        parameters.BackBufferFormat, parameters.BackBufferFormat,
                        DepthFormat.D16))
                  {
                        parameters.AutoDepthStencilFormat = DepthFormat.D16;
                        parameters.EnableAutoDepthStencil = true;
                  }
                  else
                  {
                        throw new Exception("This application requires an adapter with a 16-bit depth buffer.");
                  }

                  // examine the device capabilities
                  caps = Microsoft.DirectX.Direct3D.Manager.GetDeviceCaps(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware);

                  flags = Microsoft.DirectX.Direct3D.CreateFlags.SoftwareVertexProcessing;
                  
                  // attempt to create the device interface
                  device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, this, flags, parameters);
                  if (device == null) throw new Exception("Device was not allocated.");

                  vb = new VertexBuffer(typeof(CustomVertex.TransformedTextured),
                        4,
                        device,
                        Usage.WriteOnly,
                        CustomVertex.TransformedTextured.Format,
                        Pool.Default);

                  texture = TextureLoader.FromFile(device, "menu.jpg");

                  CustomVertex.TransformedTextured[] data =
                        new CustomVertex.TransformedTextured[4];
                  data[0].X = 0.0f;
                  data[0].Y = 0.0f;
                  data[0].Z = 0.0f;
                  data[0].Tu = 0.0f;
                  data[0].Tv = 0.0f;
                  data[1].X = device.Viewport.Width;
                  data[1].Y = 0.0f;
                  data[1].Z = 0.0f;
                  data[1].Tu = 1.0f;
                  data[1].Tv = 0.0f;
                  data[2].X = 0.0f;
                  data[2].Y = device.Viewport.Height;
                  data[2].Z = 0.0f;
                  data[2].Tu = 0.0f;
                  data[2].Tv = 1.0f;
                  data[3].X = device.Viewport.Width;
                  data[3].Y = device.Viewport.Height;
                  data[3].Z = 0.0f;
                  data[3].Tu = 1.0f;
                  data[3].Tv = 1.0f;

                  vb.SetData(data, 0, 0);
                  
                  terminate = false;
                  while (!terminate)      
                  {
                        device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);
                        device.BeginScene();
                        
                        device.SetTexture(0, texture);
                        device.VertexFormat = CustomVertex.TransformedTextured.Format;
                        device.SetStreamSource(0, vb, 0);
                        device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);

                        device.EndScene();
                        device.Present();
                        Application.DoEvents();
                  }
                  Application.Exit();
            }
            catch (Exception exception)
            {
                  System.Windows.Forms.MessageBox.Show(
                        exception.ToString(), "EXCEPTION: " + Application.ProductName,
                        System.Windows.Forms.MessageBoxButtons.OK);
            }
      }

      /// <summary>
      /// Clean up any resources being used.
      /// </summary>
      protected override void Dispose( bool disposing )
      {
            if( disposing )
            {
                  if(components != null)
                  {
                        components.Dispose();
                  }
            }
            base.Dispose( disposing );
      }

      #region Windows Form Designer generated code
      /// <summary>
      /// Required method for Designer support - do not modify
      /// the contents of this method with the code editor.
      /// </summary>
      private void InitializeComponent()
      {
            //
            // Form
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(294, 268);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.Name = "Form";
            this.Text = "Form";
            this.Closing += new System.ComponentModel.CancelEventHandler(this.Form_Closing);

      }
      #endregion

      /// <summary>
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
      static void Main()
      {
            try
            {
                  Application.Run(new Form());
            }
            catch (Exception)
            {}
      }

      private void Form_Closing(object sender, System.ComponentModel.CancelEventArgs e)
      {
            terminate = true;
      }
}      
0
Comment
Question by:0paque
1 Comment
 
LVL 1

Accepted Solution

by:
Imhotep earned 750 total points
ID: 9708427
Hi 0paque,

I think the problem is that you place your vertices at a z of 0.0, this is too close. It gets culled by the near clipping plane. try setting it to a higher value, maybe 0.1 will do. To be sure, set the clipping planes manually.
0

Featured Post

How to Use the Help Bell

Need to boost the visibility of your question for solutions? Use the Experts Exchange Help Bell to confirm priority levels and contact subject-matter experts for question attention.  Check out this how-to article for more information.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

What is RenderMan: RenderMan is a not any particular piece of software. RenderMan is an industry standard, defining set of rules that any rendering software should use, to be RenderMan-compliant. Pixar's RenderMan is a flagship implementation of …
Recently, in one of the tech-blogs I usually read, I saw a post about the best-selling video games through history. The first place in the list is for the classic, extremely addictive Tetris. Well, a long time ago, in a galaxy far far away, I was…
Loops Section Overview
Despite its rising prevalence in the business world, "the cloud" is still misunderstood. Some companies still believe common misconceptions about lack of security in cloud solutions and many misuses of cloud storage options still occur every day. …

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question