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:
The texture is attached
Thanks