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); } } }
Mitäpä tähän sanoisi
Aihe on jo aika vanha, joten et voi enää vastata siihen.