D3DXCreateSphere and Texture

Started by
7 comments, last by 21st Century Moose 11 years, 8 months ago
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:
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;
}


Render:
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);


Img:
qys51d.jpg


The texture is attached

Thanks
http://mateusvitali.wordpress.com/
Advertisement
No one? :(
http://mateusvitali.wordpress.com/
what is the problem? What is the error?
The image is not being applied 100% on the sphere, look where I put the red mark

apg2nk.jpg
http://mateusvitali.wordpress.com/
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.

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

I would rather, would be helpful ;)

Thanks
http://mateusvitali.wordpress.com/
Rather than clog up the forum with this, I've pastebinned it: http://pastebin.com/GZV8mbbC

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. ;)

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.


Rather than clog up the forum with this, I've pastebinned it: http://pastebin.com/GZV8mbbC

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. ;)



thank you! how its function VectorNormalize?

Why did you leave the FVF in CreateVertexBuffer to 0?
http://mateusvitali.wordpress.com/
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.

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

This topic is closed to new replies.

Advertisement