Jump to content

  • Log In with Google      Sign In   
  • Create Account


D3DXCreateSphere and Texture


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
8 replies to this topic

#1 VitaliBR   Members   -  Reputation: 147

Like
0Likes
Like

Posted 07 August 2012 - 07:44 AM

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:
Posted Image


The texture is attached

Thanks

Attached Thumbnails

  • world.jpg

Edited by VitaliBR, 07 August 2012 - 07:46 AM.


Sponsor:

#2 VitaliBR   Members   -  Reputation: 147

Like
0Likes
Like

Posted 08 August 2012 - 07:10 AM

No one? :(

#3 DJTN   Members   -  Reputation: 199

Like
0Likes
Like

Posted 08 August 2012 - 07:17 AM

what is the problem? What is the error?

#4 VitaliBR   Members   -  Reputation: 147

Like
0Likes
Like

Posted 08 August 2012 - 09:02 AM

The image is not being applied 100% on the sphere, look where I put the red mark

Posted Image

#5 mhagain   Crossbones+   -  Reputation: 6311

Like
0Likes
Like

Posted 08 August 2012 - 09:45 AM

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.

It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.


#6 VitaliBR   Members   -  Reputation: 147

Like
0Likes
Like

Posted 08 August 2012 - 10:24 AM

I would rather, would be helpful ;)

Thanks

#7 mhagain   Crossbones+   -  Reputation: 6311

Like
0Likes
Like

Posted 08 August 2012 - 01:25 PM

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

Edited by mhagain, 08 August 2012 - 01:27 PM.

It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.


#8 VitaliBR   Members   -  Reputation: 147

Like
0Likes
Like

Posted 09 August 2012 - 05:22 AM

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?

Edited by VitaliBR, 09 August 2012 - 05:40 AM.


#9 mhagain   Crossbones+   -  Reputation: 6311

Like
0Likes
Like

Posted 09 August 2012 - 08:29 AM

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.

It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS