Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Skybox-luokka (C# + DX9)

Tumpelo [12.06.2007 13:23:30]

#

Tuli tehtyä tällainen kätevä (?) luokka skyboxin eli taivaan piirtämiseen. Jos joku haluaa niin voipi pistää luokan suoraan käyttöön sillä sen käyttöliittymä on varsin helppo eikä sisälmyksiä tarvi välttämättä tutkia. Yksi kohta tosin löytyy jota luultavasti jokainen haluaa muokata, eli se mistä tekstuurit ladataan. Olen merkinnyt sen kohdan koodiin selvästi.

Käyttöhän toimii niin että ensiksi luodaan skybox-olio: private Skybox foo = new Skybox();. Sitten kun directX Device on määritelty muualla koodissa, voidaan rakentaa skybox käyttövalmiiksi: foo.Create(Microsoft.DirectX.Direct3D.Device device, string fileName);. Eli D3D devicen nimi ja tekstuurien nimi. Muokkaamattomana koodi etsii material\skyboxes\ kansiosta tiedostoja jotka päättyvät _south.bmp, _west.bmp jne ja niiden edellä on tunnus joka annetaan parametrina. Tätä voi muokata mieleisekseen. Lopulta skybox piirretään BeginScenen ja EndScenen välissä foo.Draw(Microsoft.DirectX.Direct3D.Device device);.

Koitin optimoida piirron mahdollisimman nopeaksi mutta jos löytyy parannettaa, myös muuta kuin optimointiin liittyvää, niin kertokaa ihmeessä.

Tekstuurit voi tehdä itse esim. Terragenilla tai ladata vaikka tuolta: http://www.hazelwhorley.com/textures.html . Kannattaa myös huomata että luokka ei piirrä laatikon pohjaa sillä oletin että sitä tuskin tarvitaan, eihän peleissä yleensä lattian läpi katsota. Turhaa välimuistin kulutusta. >:O

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace DirectX_Training
{
    class Skybox
    {
        private VertexBuffer vertexBufferNorth = null;
        private VertexBuffer vertexBufferEast = null;
        private VertexBuffer vertexBufferWest = null;
        private VertexBuffer vertexBufferSouth = null;
        private VertexBuffer vertexBufferUp = null;
        private IndexBuffer indexBuffer = null;
        private CustomVertex.PositionNormalTextured[] vertices = null;
        private short[] indices = null;

        private Texture textureNorth = null;
        private Texture textureEast = null;
        private Texture textureWest = null;
        private Texture textureSouth = null;
        private Texture textureUp = null;

        public Skybox()
        {
        }

        public void Create(Microsoft.DirectX.Direct3D.Device device, string fileName)
        {
            //Käytetään verteksipuskuria nopeuden maksimointiin
            vertexBufferNorth = new VertexBuffer(typeof(CustomVertex.PositionNormalTextured), 4, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default);

            //verteksien formaatti, luonnollisesti tarvitaan sijainti, normaali ja tekstuuri
            vertices = new CustomVertex.PositionNormalTextured[4];

            //North left up     || näitä en jaksanut suomentaa, kai kaikki osaa ilmansuunnat englanniksi ;)
            vertices[0].Position = new Vector3(-50f, 50f, 50f);
            vertices[0].Normal = new Vector3(0, 0, -1);
            vertices[0].Tu = 0;
            vertices[0].Tv = 0;
            //North left down
            vertices[1].Position = new Vector3(-50f, -50f, 50f);
            vertices[1].Normal = new Vector3(0, 0, -1);
            vertices[1].Tu = 0;
            vertices[1].Tv = 1;
            //North right up
            vertices[2].Position = new Vector3(50f, 50f, 50f);
            vertices[2].Normal = new Vector3(0, 0, -1);
            vertices[2].Tu = 1;
            vertices[2].Tv = 0;
            //North right down
            vertices[3].Position = new Vector3(50f, -50f, 50f);
            vertices[3].Normal = new Vector3(0, 0, -1);
            vertices[3].Tu = 1;
            vertices[3].Tv = 1;

            //Ja sitten verteksit pusketaan puskuriin, ja sama operaatio toistuu nyt jokaiselle sivustalle
            vertexBufferNorth.SetData(vertices, 0, LockFlags.None);

            vertexBufferEast = new VertexBuffer(typeof(CustomVertex.PositionNormalTextured), 4, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default);

            //East left up
            vertices[0].Position = new Vector3(50f, 50f, 50f);
            vertices[0].Normal = new Vector3(0, -1, 0);
            vertices[0].Tu = 0;
            vertices[0].Tv = 0;
            //East left down
            vertices[1].Position = new Vector3(50f, -50f, 50f);
            vertices[1].Normal = new Vector3(0, -1, 0);
            vertices[1].Tu = 0;
            vertices[1].Tv = 1;
            //East right up
            vertices[2].Position = new Vector3(50f, 50f, -50f);
            vertices[2].Normal = new Vector3(0, -1, 0);
            vertices[2].Tu = 1;
            vertices[2].Tv = 0;
            //East right down
            vertices[3].Position = new Vector3(50f, -50f, -50f);
            vertices[3].Normal = new Vector3(0, -1, 0);
            vertices[3].Tu = 1;
            vertices[3].Tv = 1;

            vertexBufferEast.SetData(vertices, 0, LockFlags.None);

            vertexBufferWest = new VertexBuffer(typeof(CustomVertex.PositionNormalTextured), 4, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default);

            //West left up
            vertices[0].Position = new Vector3(-50f, 50f, -50f);
            vertices[0].Normal = new Vector3(0, -1, 0);
            vertices[0].Tu = 0;
            vertices[0].Tv = 0;
            //West left down
            vertices[1].Position = new Vector3(-50f, -50f, -50f);
            vertices[1].Normal = new Vector3(0, -1, 0);
            vertices[1].Tu = 0;
            vertices[1].Tv = 1;
            //West right up
            vertices[2].Position = new Vector3(-50f, 50f, 50f);
            vertices[2].Normal = new Vector3(0, -1, 0);
            vertices[2].Tu = 1;
            vertices[2].Tv = 0;
            //West right down
            vertices[3].Position = new Vector3(-50f, -50f, 50f);
            vertices[3].Normal = new Vector3(0, -1, 0);
            vertices[3].Tu = 1;
            vertices[3].Tv = 1;

            vertexBufferWest.SetData(vertices, 0, LockFlags.None);

            vertexBufferSouth = new VertexBuffer(typeof(CustomVertex.PositionNormalTextured), 4, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default);

            vertices = new CustomVertex.PositionNormalTextured[4];

            //South left up
            vertices[0].Position = new Vector3(50f, 50f, -50f);
            vertices[0].Normal = new Vector3(0, 0, -1);
            vertices[0].Tu = 0;
            vertices[0].Tv = 0;
            //South left down
            vertices[1].Position = new Vector3(50f, -50f, -50f);
            vertices[1].Normal = new Vector3(0, 0, -1);
            vertices[1].Tu = 0;
            vertices[1].Tv = 1;
            //South right up
            vertices[2].Position = new Vector3(-50f, 50f, -50f);
            vertices[2].Normal = new Vector3(0, 0, -1);
            vertices[2].Tu = 1;
            vertices[2].Tv = 0;
            //South right down
            vertices[3].Position = new Vector3(-50f, -50f, -50f);
            vertices[3].Normal = new Vector3(0, 0, -1);
            vertices[3].Tu = 1;
            vertices[3].Tv = 1;

            vertexBufferSouth.SetData(vertices, 0, LockFlags.None);

            vertexBufferUp = new VertexBuffer(typeof(CustomVertex.PositionNormalTextured), 4, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default);

            vertices = new CustomVertex.PositionNormalTextured[4];

            //Up left up
            vertices[0].Position = new Vector3(-50f, 50f, -50f);
            vertices[0].Normal = new Vector3(0, 0, -1);
            vertices[0].Tu = 0;
            vertices[0].Tv = 0;
            //Up left down
            vertices[1].Position = new Vector3(-50f, 50f, 50f);
            vertices[1].Normal = new Vector3(0, 0, -1);
            vertices[1].Tu = 0;
            vertices[1].Tv = 1;
            //Up right up
            vertices[2].Position = new Vector3(50f, 50f, -50f);
            vertices[2].Normal = new Vector3(0, 0, -1);
            vertices[2].Tu = 1;
            vertices[2].Tv = 0;
            //Up right down
            vertices[3].Position = new Vector3(50f, 50f, 50f);
            vertices[3].Normal = new Vector3(0, 0, -1);
            vertices[3].Tu = 1;
            vertices[3].Tv = 1;

            vertexBufferUp.SetData(vertices, 0, LockFlags.None);



            //Sitten luodaan indeksipuskuri
            indexBuffer = new IndexBuffer(typeof(short), 6, device, Usage.WriteOnly, Pool.Default);

            indices = new short[6];

            indices[0] = 0;
            indices[1] = 3;
            indices[2] = 1;

            indices[3] = 0;
            indices[4] = 2;
            indices[5] = 3;

            indexBuffer.SetData(indices, 0, LockFlags.None);



            // HUOM HUOM HUOM HUOM HUOM HUOM
            // Nyt tulee tekstuurien lataus joka kannattaa muokata mieleisekseen ;)



            textureNorth = TextureLoader.FromFile(device, @"material\skyboxes\" + fileName + "_north.bmp");
            textureEast = TextureLoader.FromFile(device, @"material\skyboxes\" + fileName + "_east.bmp");
            textureWest = TextureLoader.FromFile(device, @"material\skyboxes\" + fileName + "_west.bmp");
            textureSouth = TextureLoader.FromFile(device, @"material\skyboxes\" + fileName + "_south.bmp");
            textureUp = TextureLoader.FromFile(device, @"material\skyboxes\" + fileName + "_up.bmp");
        }

        //Piirtäminen, ihan peruskamaa
        public void Draw(Microsoft.DirectX.Direct3D.Device device)
        {
            //Verteksien formaatti..
            device.VertexFormat = CustomVertex.PositionNormalTextured.Format;

            //Käytetään indeksipuskuria
            device.Indices = indexBuffer;

            //Ja piirretään joka sivusta, välissä toki tekstuuri ja verteksipuskuri vaihdetaan

            device.SetStreamSource(0, vertexBufferNorth, 0);
            device.SetTexture(0, textureNorth);
            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 4, 0, 2);

            device.SetStreamSource(0, vertexBufferEast, 0);
            device.SetTexture(0, textureEast);
            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 4, 0, 2);

            device.SetStreamSource(0, vertexBufferWest, 0);
            device.SetTexture(0, textureWest);
            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 4, 0, 2);

            device.SetStreamSource(0, vertexBufferSouth, 0);
            device.SetTexture(0, textureSouth);
            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 4, 0, 2);

            device.SetStreamSource(0, vertexBufferUp, 0);
            device.SetTexture(0, textureUp);
            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 4, 0, 2);
        }
    }
}

tesmu [24.08.2007 00:41:46]

#

Mitäpä tähän sanoisi

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta