Jump to content
  • Advertisement
Sign in to follow this  
Direct

Help with simple skybox

This topic is 4942 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I previously had some questions regarding this in the .net forum, but I think my problem at this point is now DirectX, so I'm continuing my questions here instead. I am using C#, though, as you'll see in the code following. Problem is I've hashed together a simple sky box from what I found as examples (mostly c++ examples) and other bits and pieces here and there. But, when I move around, the sky has a big black square or triangle (depending on which way is forward for me exactly) cut out of it...and it is always directly in front of the camera, havent' seen any anomalies elsewhere. Anybody have any suggestions on how to fix? Here's the current little render function that is pumping out the skybox...it isn't elegant but I'm just trying to do the job, if you will:
public bool render(Vector3 pos) {
	float wid = 2000.0f, hgt = 2000.0f, depth = 2000.0f;

	// Calculate half the width, height, and depth	
	float w = wid * 0.5f;
	float h = hgt * 0.5f;
	float d = depth * 0.5f;

	VertexBuffer vb = new VertexBuffer(typeof(CustomVertex.PositionTextured), kMaxVerts, device, Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Managed);
	CustomVertex.PositionTextured[] v = new CustomVertex.PositionTextured[kMaxVerts];
	GraphicsStream gsv = vb.Lock(0, 0, 0);

	// Fill back
	v[0].X = pos.X + w; v[0].Y = pos.Y - h; v[0].Z = pos.Z - d; v[0].Tu = 1.0f; v[0].Tv = 1.0f;
	v[1].X = pos.X + w; v[1].Y = pos.Y + h; v[1].Z = pos.Z - d; v[1].Tu = 1.0f; v[1].Tv = 0.0f;
	v[2].X = pos.X - w; v[2].Y = pos.Y + h; v[2].Z = pos.Z - d; v[2].Tu = 0.0f; v[2].Tv = 0.0f;
	v[3].X = pos.X - w; v[3].Y = pos.Y - h; v[3].Z = pos.Z - d; v[3].Tu = 0.0f; v[3].Tv = 1.0f;

	// Fill front
	v[4].X = pos.X - w; v[4].Y = pos.Y - h; v[4].Z = pos.Z + d; v[4].Tu = 1.0f; v[4].Tv = 1.0f;
	v[5].X = pos.X - w; v[5].Y = pos.Y + h; v[5].Z = pos.Z + d; v[5].Tu = 1.0f; v[5].Tv = 0.0f;
	v[6].X = pos.X + w; v[6].Y = pos.Y + h; v[6].Z = pos.Z + d; v[6].Tu = 0.0f; v[6].Tv = 0.0f;
	v[7].X = pos.X + w; v[7].Y = pos.Y - h; v[7].Z = pos.Z + d; v[7].Tu = 0.0f; v[7].Tv = 1.0f;

	// Fill bottom
	v[8].X = pos.X - w; v[8].Y = pos.Y - h; v[8].Z = pos.Z - d; v[8].Tu = 1.0f; v[8].Tv = 1.0f;
	v[9].X = pos.X - w; v[9].Y = pos.Y - h; v[9].Z = pos.Z + d; v[9].Tu = 1.0f; v[9].Tv = 0.0f;
	v[10].X = pos.X + w; v[10].Y = pos.Y - h; v[10].Z = pos.Z + d; v[10].Tu = 0.0f; v[10].Tv = 0.0f;
	v[11].X = pos.X + w; v[11].Y = pos.Y - h; v[11].Z = pos.Z - d; v[11].Tu = 0.0f; v[11].Tv = 1.0f;

	// Fill top
	v[12].X = pos.X + w; v[12].Y = pos.Y + h; v[12].Z = pos.Z - d; v[12].Tu = 0.0f; v[12].Tv = 0.0f;
	v[13].X = pos.X + w; v[13].Y = pos.Y + h; v[13].Z = pos.Z + d; v[13].Tu = 0.0f; v[13].Tv = 1.0f;
	v[14].X = pos.X - w; v[14].Y = pos.Y + h; v[14].Z = pos.Z + d; v[14].Tu = 1.0f; v[14].Tv = 1.0f;
	v[15].X = pos.X - w; v[15].Y = pos.Y + h; v[15].Z = pos.Z - d; v[15].Tu = 1.0f; v[15].Tv = 0.0f;
	
	// Fill the left side
	v[16].X = pos.X - w; v[16].Y = pos.Y + h; v[16].Z = pos.Z - d; v[16].Tu = 1.0f; v[16].Tv = 0.0f;
	v[17].X = pos.X - w; v[17].Y = pos.Y + h; v[17].Z = pos.Z + d; v[17].Tu = 0.0f; v[17].Tv = 0.0f;
	v[18].X = pos.X - w; v[18].Y = pos.Y - h; v[18].Z = pos.Z + d; v[18].Tu = 0.0f; v[18].Tv = 1.0f;
	v[19].X = pos.X - w; v[19].Y = pos.Y - h; v[19].Z = pos.Z - d; v[19].Tu = 1.0f; v[19].Tv = 1.0f;
	
	// Fill the right side
	v[20].X = pos.X + w; v[20].Y = pos.Y - h; v[20].Z = pos.Z - d; v[20].Tu = 0.0f; v[20].Tv = 1.0f;
	v[21].X = pos.X + w; v[21].Y = pos.Y - h; v[21].Z = pos.Z + d; v[21].Tu = 1.0f; v[21].Tv = 1.0f;
	v[22].X = pos.X + w; v[22].Y = pos.Y + h; v[22].Z = pos.Z + d; v[22].Tu = 1.0f; v[22].Tv = 0.0f;
	v[23].X = pos.X + w; v[23].Y = pos.Y + h; v[23].Z = pos.Z - d; v[23].Tu = 0.0f; v[23].Tv = 0.0f;

	gsv.Write(v);
	vb.Unlock();

	const int kMaxIndices = 12 * 3;

	int[] indexList = new int[kMaxIndices] {0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4, 8, 9, 10, 10, 11, 8, 12, 13, 14, 14, 15, 12, 16, 17, 18, 18, 19, 16, 20, 21, 22, 22, 23, 20};
			
	IndexBuffer ib = new IndexBuffer(typeof(int), kMaxIndices, device, Usage.WriteOnly, Pool.Managed);
	GraphicsStream gsi = ib.Lock(0, 0, 0);
	gsi.Write(indexList);
	ib.Unlock();

	for(int i = 0, j = 0; i < kMaxTextures; ++i, j += 6) {
		// Select the texture for the current side
		device.SetTexture(0, tex); 
		// Render it...
		device.SetStreamSource(0,vb,0);
		device.VertexFormat = CustomVertex.PositionTextured.Format;
		device.Indices = ib;
		device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, kMaxVerts, j, 2);

	}

	return true;
}






Share this post


Link to post
Share on other sites
Advertisement
two things,

First off, regarding your problem, you might have one primitive flipped (with back to you).

Try setting the CullMode to CullNone, and see if that makes it show. If so, look for the reversed order one.

Secondly, I see you're creating your VB every frame. Also, I don't see any release code (I think it's not needed in C# but I'm not sure).

At any rate, creating and locking a VB every frame would be quite costly, performance wise, in your app. As far as I can see, the data remains the same every frame, so you really should only create the VB and load the data once, and then just render it every frame.

If for some reason you do need to lock and modify the data every frame, I'd recommend you at least not create the VB every frame, but rather create it once and use it over and over.

Good luck :).

Share this post


Link to post
Share on other sites
Thanks for the performance tips.


I turned cullmod to none and it still has the black box, it doesn't appear that the problem is a back facing polygon. Any other thoughts?

Share this post


Link to post
Share on other sites
Try different far clip plane values. Perhaps you're seeing the effect of the far plane clipping the sky box to some degree? Just an idea.

GCoder

Share this post


Link to post
Share on other sites
Hehe, thanks for tossing in the tip, though :) And thanks again for the performance suggestions...gives me something fun to fiddle with :)

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!