none
Наложение текстуры на стандартную сферу. (direct3d, C#) RRS feed

  • Вопрос

  • Средствами direct3d создано 3D – устройство, mesh – объект, загружена текстура.

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Microsoft.DirectX;
    using Microsoft.DirectX.Direct3D;
    
    namespace l006
    {
        public partial class Form1 : Form
        {
            float ar = 4f / 3f;
            Color bc = Color.Gray;
            Device dr;
            PresentParameters ppr = new PresentParameters();
            Mesh myp;
            Material matmyp;
            Texture txback;
            Vector3 cp = new Vector3(20, 0, 0), ct = new Vector3(0, 0, 0), cup = new Vector3(0, 0, 1);
    
            public Form1()
            {
                InitializeComponent();
                this.ClientSize = new Size(800, 600);
            }
    
            //Инициализация 3D устройства
            public bool InitializeGraphics()
            {
                try
                {
                    ppr.Windowed = true;
                    ppr.SwapEffect = SwapEffect.Discard;
                    ppr.EnableAutoDepthStencil = true;
                    ppr.AutoDepthStencilFormat = DepthFormat.D24S8;
                    try
                    {
                        dr = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, ppr);
                    }
                    catch
                    {
                        dr = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, ppr);
                    }
                    dr.DeviceResizing += new CancelEventHandler(dr_DeviceResizing);
                    return true;
                }
                catch
                {
                    return false;
                }
            }
    
            //Изменение размеров 3D окна
            void dr_DeviceResizing(object sender, CancelEventArgs e)
            {
                ar = (float)this.ClientSize.Width / (float)this.ClientSize.Height;
            }
    
            //Загрузка формы
            private void Form1_Load(object sender, EventArgs e)
            {
                if (!this.InitializeGraphics())
                {
                    MessageBox.Show("Невозможно инициализировать Direct3D устройство. Программа будет закрыта.");
                    this.Close();
                }
                try
                {
                    txback = TextureLoader.FromFile(dr, "Content/back01.png");
                }
                catch
                {
                    MessageBox.Show("Не удалось загрузить текстуру");
                }
                //Создание сферы
                myp = Mesh.Sphere(dr, 5, 10, 10);
                matmyp.Diffuse = Color.White;
                timer1.Enabled = true;
            }
    
            //Вывод по таймеру
            private void timer1_Tick(object sender, EventArgs e)
            {
                try
                {
                    dr.BeginScene();
                    dr.RenderState.CullMode = Cull.None;
                    dr.RenderState.ZBufferEnable = true;
                    dr.RenderState.NormalizeNormals = true;
                    dr.Lights[0].Type = LightType.Directional;
                    dr.Lights[0].Diffuse = System.Drawing.Color.White;
                    dr.Lights[0].Direction = ct - cp;
                    dr.Lights[0].Enabled = true;
                    dr.Clear(ClearFlags.ZBuffer | ClearFlags.Target, bc, 1f, 0);
                    dr.Transform.View = Matrix.LookAtRH(cp, ct, cup);
                    dr.Transform.Projection = Matrix.PerspectiveFovRH((float)Math.PI / 4f, ar, 1f, 200f);
                    //Отрисовка сферы
                    dr.Material = matmyp;
                    dr.SetTexture(0, txback);
                    myp.DrawSubset(0);
                    dr.EndScene();
                    dr.Present();
                }
                catch
                {
                    this.Close();
                }
            }
        }
    }

    сфера окрашивается цветом левого верхнего пикселя текстуры.



    Как правильно наложить текстуру на стандартную сферу?

    Возможно ли это? Или придется моделировать сферу из треугольников?

    • Изменено hellokol 2 ноября 2011 г. 6:25
    1 ноября 2011 г. 13:42

Ответы

  • Судя по всему, в mesh – объектах созданных стандартными методами (Sphere, Box, и др.), отсутствуют текстурные координаты. Пришлось создать модель самому (sh01.x) и загрузить из внешнего файла.

                try
                {
                    myp = Mesh.FromFile("Content/sh01.x", MeshFlags.Managed, dr);
                }
                catch
                {
                    MessageBox.Show("Ошибка при загрузке модели.");
                }
    

    • Помечено в качестве ответа hellokol 5 ноября 2011 г. 7:12
    5 ноября 2011 г. 7:11

Все ответы