Jump to content
  • Advertisement
Sign in to follow this  
noodleBowl

DX11 Triangle rotation on X and Y axis cuts out?

Recommended Posts

I am attempting to rotate a triangle around the X / Y axis, but for some reason I cannot get the triangle to display in some cases (screen is blank)

Specific example:

If I am trying to rotate around the Y axis and use 45 degrees nothing shows. BUT using -45 degrees I see my triangle rotated correctly

If I am trying to rotate around the X axis and use 45 degrees nothing shows. BUT using -45 degrees I see my triangle rotated correctly

Am I missing something? I don't understand why I can't see it one direction but the other is fine. I understand that back-face culling happens by default, but in this case I should be able to see the triangle because I have not gone past the back-face culling threshold 

//Vertex data used
Vertex vertices[] =
{
  { 0.0f, 0.0f, 1.0f, Color(1.0f, 0.0f, 0.0f, 1.0f) },
  { 0.0f, 100.0f, 1.0f, Color(1.0f, 0.0f, 0.0f, 1.0f) },
  { 100.0f, 100.0f, 1.0f, Color(1.0f, 0.0f, 0.0f, 1.0f) }
};

//Matrix setup. Matrices are column-major
//My Matrix4 class are Identity matrix by default
Matrix4 model; 
model.rotateY(45); //rotate 45 degrees and disappear :( Same happens if the call is changed to rotateX
Matrix4 view;
Matrix4 projection;
projection.makeOrthoLH(); //Using an orthogrpahic projection

//Create the mvp
Matrix4 mvp = projection * view * model;

//Map the mvp matrix to the constant buffer
D3D11_MAPPED_SUBRESOURCE mapResource;
HRESULT mapped = deviceContext->Map(cbuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &mapResource);
((FLOAT*)mapResource.pData)[0] = mvp.data[0];
((FLOAT*)mapResource.pData)[1] = mvp.data[1];
((FLOAT*)mapResource.pData)[2] = mvp.data[2];
((FLOAT*)mapResource.pData)[3] = mvp.data[3];
((FLOAT*)mapResource.pData)[4] = mvp.data[4];
((FLOAT*)mapResource.pData)[5] = mvp.data[5];
((FLOAT*)mapResource.pData)[6] = mvp.data[6];
((FLOAT*)mapResource.pData)[7] = mvp.data[7];
((FLOAT*)mapResource.pData)[8] = mvp.data[8];
((FLOAT*)mapResource.pData)[9] = mvp.data[9];
((FLOAT*)mapResource.pData)[10] = mvp.data[10];
((FLOAT*)mapResource.pData)[11] = mvp.data[11];
((FLOAT*)mapResource.pData)[12] = mvp.data[12];
((FLOAT*)mapResource.pData)[13] = mvp.data[13];
((FLOAT*)mapResource.pData)[14] = mvp.data[14];
((FLOAT*)mapResource.pData)[15] = mvp.data[15];
deviceContext->Unmap(cbuffer, NULL);

makeOrthoLH method

void Matrix4::makeOrthoLH()
{
  //LH ORTHO hardcode in for 800x600, where near is 0.0f and far is 100.0f
  //------------------------------------
  FLOAT w = 800.0f; 
  FLOAT h = 600.0f;
  FLOAT n = 0.0f;
  FLOAT f = 100.0f;

  data[0] = 2.0f / w;
  data[1] = 0.0f;
  data[2] = 0.0f;
  data[3] = 0.0f;

  data[4] = 0.0f;
  data[5] = 2.0f / h;
  data[6] = 0.0f;
  data[7] = 0.0f;

  data[8] = 0.0f;
  data[9] = 0.0f;
  data[10] = 1 / (f - n);
  data[11] = 0.0f;

  data[12] = 0;
  data[13] = 0;
  data[14] = -n / (f-n);
  data[15] = 1.0f;
}

rotateY method

void Matrix4::rotateY(FLOAT degrees)
{
  FLOAT cosVal = cosf(degrees * PI/180.0f);
  FLOAT sinVal = sinf(degrees * PI/180.0f);
  FLOAT rot[16] = {
    cosVal, 0, -sinVal, 0,
    0, 1, 0, 0,
    sinVal, 0, cosVal, 0,
    0, 0, 0, 1
  };

  Matrix4 r(rot);
  data[0] = r.data[0];
  data[1] = r.data[1];
  data[2] = r.data[2];
  data[3] = r.data[3];

  data[4] = r.data[4];
  data[5] = r.data[5];
  data[6] = r.data[6];
  data[7] = r.data[7];

  data[8] = r.data[8];
  data[9] = r.data[9];
  data[10] = r.data[10];
  data[11] = r.data[11];

  data[12] = r.data[12];
  data[13] = r.data[13];
  data[14] = r.data[14];
  data[15] = r.data[15];
}

Shader being used

cbuffer mvpBuffer : register(b0)
{
	matrix mvp;
};

struct VOut
{
	float4 position : SV_POSITION;
	float4 color : COLOR;
};

VOut VShader(float3 position : POSITION, float4 color : COLOR)
{
	VOut output;
	output.position = mul(mvp, float4(position, 1.0f));
	output.color = color;

	return output;
}

float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
	return color;
}

 

 

Edited by noodleBowl

Share this post


Link to post
Share on other sites
Advertisement

What happens if you apply a rotation of -1 degrees? Does it still disappear? If not, then where DOES it disappear?

Share this post


Link to post
Share on other sites

So I figured it out, my near and far values were just too low

projection.makeOrthoLH()

Changed to

//Width, height, near, far
projection.makeOrthoProjection(800.0f, 600.0f, -300.0f, 300.0f);

For some reason I just thought depth was thrown out of the equation when it came to the ortho projection and I didn't think those values (near and far) mattered, but I guess things will still get clipped out of the view if they don't fall with in the volume zone 

Can anyone explain the difference between D3DXMatrixPerspectiveRH and D3DXMatrixPerspectiveFovRH? Does the D3DXMatrixPerspectiveRH just not have a FOV? How does FOV effect the projection?

Share this post


Link to post
Share on other sites
2 hours ago, noodleBowl said:

Can anyone explain the difference between D3DXMatrixPerspectiveRH and D3DXMatrixPerspectiveFovRH? Does the D3DXMatrixPerspectiveRH just not have a FOV? How does FOV effect the projection?

They're two different expressions of the same thing. The latter takes aspect and FoV-Y. The former takes the dimensions of the near plane. You can derive these quantities from each other with some simple trig.

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  

  • 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!