Skip to main content
gamedev.net
🔒 Locked

Textures per face ?

Started by steg 3 replies 250+ views
Original Post
steg
steg
Hi I am implementing a skybox into my game using the cube method. I''ve wrote some code to load the relevant bitmaps as shown below. Bitmaps I want to load for my textures... char* filenames[] = { {"c:\\Clouds\\SnowCliffLeft.bmp"}, {"c:\\Clouds\\SnowCliffRight.bmp"}, {"c:\\Clouds\\SnowCliffFront.bmp"}, {"c:\\Clouds\\SnowCliffBack.bmp"}, {"c:\\Clouds\\SnowCliffTop.bmp"}, {"c:\\Clouds\\SnowCliffBottom.bmp"}, }; in game initialisation..... r = d3dManager.LoadSkyBoxTextures(&filenames[0]); if(FAILED(r)) { d3dManager.SetError("Failed to load textures"); return E_FAIL; } // Set pointer to skybox textures pSkyBoxTextures = d3dManager.GetSkyBoxTexture(); Method to load the textures and store them... HRESULT CD3DManager::LoadSkyBoxTextures(char **pFilenames) { HRESULT r = 0; for (int i=0; i<6; i++) { if(m_pSkyBoxTexture) m_pSkyBoxTexture[i]->Release(); ShowInfo("Loading Textures..."); ShowInfo(pFilenames[i]); r = D3DXCreateTextureFromFile(m_pDevice, pFilenames[i], &m_pSkyBoxTexture[i]); if(FAILED(r)) return E_FAIL; } return r; } Returns a pointer of pointers for textures... inline IDirect3DTexture8** CD3DManager::GetSkyBoxTexture() { return m_pSkyBoxTexture; } In my rendering method... g_pDevice->SetStreamSource(0,g_pVB, sizeof(MYVERTEX)); g_pDevice->SetTexture(0, pSkyBoxTextures[i]); g_pDevice->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); g_pDevice->SetTextureStageState(0,D3DTSS_MINFILTER,D3DTEXF_LINEAR); g_pDevice->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE); g_pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 6, 12); This draws the whole cube in one go with the first texture applied to all faces, how do I draw a face at a time with a different texture - do I need a seperate vertex buffer for each face and then set the new texture between calls to DrawPrimitive ? Kind regards, sTeVe
If it isn't working, take a bath, have a think and try again...
Abstraction
Abstraction
Do something like this:

1) Bind your vertexbuffer, set your vertex format.
2) Set all your rending modes, alpha ops, texturing modes and so on.
3) Set your fist texture, then render the one face (two triangles) that corresponds to that texture. Set the next texture and render the next appropriate face. Keep doing this untill you have draw the whole skybox or at least the parts that are visible.

You could also create one big texture that has the six smaller textures in it. Then just set that texture and draw the whole skybox. I would not do this personally since my video card only supports textures up to 256 by 256. Thats like one 85 by 128 texture per face. It doesn't look good at all.




Edited by - Abstraction on January 16, 2002 11:21:49 AM
steg
steg
Hi,

I''ve done the following solution to my asked question:

g_pDevice->DrawPrimitive(g_Objects.nType,6,2);
g_pDevice->SetTexture(0, pSkyBoxTextures[1]);
g_pDevice->DrawPrimitive(g_Objects[i].nType,12,2);
g_pDevice->SetTexture(0, pSkyBoxTextures[2]);
g_pDevice->DrawPrimitive(g_Objects[i].nType,18,2);
g_pDevice->SetTexture(0, pSkyBoxTextures[3]);
g_pDevice->DrawPrimitive(g_Objects[i].nType,24,2);
g_pDevice->SetTexture(0, pSkyBoxTextures[4]);
g_pDevice->DrawPrimitive(g_Objects[i].nType,30,2);
g_pDevice->SetTexture(0, pSkyBoxTextures[5]);
g_pDevice->DrawPrimitive(g_Objects[i].nType,36,2);
g_pDevice->SetTexture(0, pSkyBoxTextures[6]);

Regards,
sTeVe
If it isn't working, take a bath, have a think and try again...
Abstraction
Abstraction
Right on. You really didn''t need help after all.
steg
steg
Thanks for you help Abstraction.

See my next post on moving the skybox!

Regards,
sTeVe
If it isn't working, take a bath, have a think and try again...

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.