Sign in to follow this  
VitaliBR

D3DXCreateSphere and Texture

Recommended Posts

I'm trying to do a few hours texturing my sphere, but it's happening a strange error. (sorry my poor english)
radius = 3.0f
slices = 32
stacks = 32

My code:
[CODE]void LoadSphere()
{
// create the sphere mesh
D3DXCreateSphere(devices.d3ddev, radius, slices, stacks, &pMesh, NULL);
// exist texture to load
if(!fileTexture.empty())
{
HRESULT hr = D3D_OK;

hr = D3DXCreateTextureFromFile(devices.d3ddev, fileTexture.c_str(), &sphereTexture);
if(FAILED(hr))
{
Log::Instance().AddEntry("Error ir loading texture " + fileTexture);
}
else
{
LPD3DXMESH cloneMesh = NULL;
if(FAILED(pMesh->CloneMeshFVF(NULL, SPHEREFVFtex, devices.d3ddev, &cloneMesh)))
{
//Reset Clone Mesh
cloneMesh = NULL;
Log::Instance().AddEntry("Error in CloneMeshFVF");
}
//Create Texture Cordinates
if(cloneMesh!=NULL)
{
//Release Previous Mesh
pMesh->Release();
//Create new Vertex Buffer
int numVertices = cloneMesh->GetNumVertices();
LPDIRECT3DVERTEXBUFFER9 pVB=NULL;
SDX_CUSTOMVERTEXtex* pVer = NULL;
cloneMesh->GetVertexBuffer(&pVB);
pVB->Lock(0,0,(VOID**)&pVer,0);

DWORD n;
for(n = 0; n < numVertices; n++)
{
float u,v;
Convert(pVer[n].X, pVer[n].Y, pVer[n].Z, radius, u, v);
pVer[n].Tu = u;
pVer[n].Tv = v;
}
pVB->Unlock();
//Set pMesh to New Mesh
pMesh = cloneMesh;
hasTexture = true;
}
else
{
hasTexture = false;
}
}
}
}
Convert(float x,float y,float z,float r,float& u,float& v)
{
float q;
float q2;
q = atan2(z,x);
u = q / (2.0f * 3.1415f);
q2 = asin(y/r);
v = (1.0f-q2/(3.1415f/2.0f))/2.0f;
if(u > 1.0)
u = 1.0;
}[/CODE]

Render:
[CODE]if(hasTexture)
{
devices.d3ddev->SetFVF(SPHEREFVFtex);
devices.d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
devices.d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
devices.d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
// Set texture
devices.d3ddev->SetTexture(0, sphereTexture) ;
}
// draw the sphere
pMesh->DrawSubset(0);[/CODE]

Img:
[img]http://i49.tinypic.com/qys51d.jpg[/img]


The texture is attached

Thanks Edited by VitaliBR

Share this post


Link to post
Share on other sites
The image is not being applied 100% on the sphere, look where I put the red mark

[img]http://i47.tinypic.com/apg2nk.jpg[/img]

Share this post


Link to post
Share on other sites
I had the same problem some years ago, but with Jupiter rather than Earth. ;) If memory serves I ended up dumping D3DXCreateSphere and just made my own sphere code instead. I can try find it later on this evening and post it for you if you're interested.

Share this post


Link to post
Share on other sites
Rather than clog up the forum with this, I've pastebinned it: [url="http://pastebin.com/GZV8mbbC"]http://pastebin.com/GZV8mbbC[/url]

The vertex format I used was position (3 floats), normal (3 floats) and texcoords (2 floats) - which I've called 's' and 't' rather than 'u' and 'v', showing my OpenGL background (I'm actually fairly certain that I pulled the original from MESA's implementation of GLU quadrics).

Disclaimer: this is OLD code for me so don't be expecting it to have much in the way of modern coding styles, OK. ;) Edited by mhagain

Share this post


Link to post
Share on other sites
[quote name='mhagain' timestamp='1344453930' post='4967494']
Rather than clog up the forum with this, I've pastebinned it: [url="http://pastebin.com/GZV8mbbC"]http://pastebin.com/GZV8mbbC[/url]

The vertex format I used was position (3 floats), normal (3 floats) and texcoords (2 floats) - which I've called 's' and 't' rather than 'u' and 'v', showing my OpenGL background (I'm actually fairly certain that I pulled the original from MESA's implementation of GLU quadrics).

Disclaimer: this is OLD code for me so don't be expecting it to have much in the way of modern coding styles, OK. ;)
[/quote]


thank you! how its function VectorNormalize?

Why did you leave the FVF in CreateVertexBuffer to 0? Edited by VitaliBR

Share this post


Link to post
Share on other sites
VectorNormalize just normalizes a vector. ;)

You don't need to set FVF in CreateVertexBuffer unless you're using the old software T&L ProcessVertices call.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this