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;
}
↧