Jump to content


Software rendering pipeline - problem


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

#1 kurlyak

    Member

  • Members
  • PipPip
  • 93 posts

Posted 14 February 2013 - 08:44 AM

I try do draw textured cube. I have structure C++ for store vertices. Then I multiply this vertices by mxWorld, mxView, mxProjection. Then transformed vertices translate into screen space, then draw triangle. But I have one problem. My triangle draws wrong when its vertices is out of screen space of monitor.

For example v1y = 200, v2y = 400, v3y = 400 in screen coord. Triangles draws ok. But when v1 not within of screen of monitor, and v1 very fast change on more and more great value. For example v1y out of screen space: v1y= -20523, v2y = 100, v3y = 100 (vert v2y and v3y is within of screen space). Then I this triangle a little move more higher and v1y = - 50324, v2y = 50, v3y= 50. I can not properly draw my triangles when v1Y very fast changing not within screen.

This my short piece of code:


My3DMatrix4x4 mWorld(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,0, 0, 0, 1);

m_pCamera->FrameMove(0.03f);
My3DMatrix4x4 mView = m_pCamera->GetViewMatrix();

float fFov = 3.1415926f/4.0f;
float fAspect = 4.0f/3.0f;
float fZFar = 250.0;
float fZNear = 0.001f;
float	h, w, Q;
w = (1.0f/tan(fFov*0.5f))/fAspect;
h = 1.0f/tan(fFov*0.5f);  
Q = fZFar/(fZFar - fZNear);

My3DMatrix4x4 mProj(
w, 0, 0, 0,
0, h, 0, 0,
0, 0, Q, 1,
0, 0, -Q*fZNear, 0);

My3DMatrix4x4 mRes(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);

mRes = My3DMatrixMultiply(mRes, mWorld);
mRes = My3DMatrixMultiply(mRes, mView);
mRes = My3DMatrixMultiply(mRes, mProj);

//Transform vertices into homogeneous space
for( int i = 0; i < 12; i++)
{
My3DVector3 v1 = My3DVec3TransformCoord(My3DVector3(pMy3DTriangle_Original[i].v1.x,
pMy3DTriangle_Original[i].v1.y,
pMy3DTriangle_Original[i].v1.z),
mRes);
  

pMy3DTriangle_Transformed[i].v1.x = v1.x;
pMy3DTriangle_Transformed[i].v1.y = v1.y;
pMy3DTriangle_Transformed[i].v1.z = v1.z;
My3DVector3 v2 = My3DVec3TransformCoord(My3DVector3(pMy3DTriangle_Original[i].v2.x,
pMy3DTriangle_Original[i].v2.y,
pMy3DTriangle_Original[i].v2.z),
mRes);

pMy3DTriangle_Transformed[i].v2.x = v2.x;
pMy3DTriangle_Transformed[i].v2.y = v2.y;
pMy3DTriangle_Transformed[i].v2.z = v2.z;

My3DVector3 v3 = My3DVec3TransformCoord(My3DVector3(pMy3DTriangle_Original[i].v3.x,
pMy3DTriangle_Original[i].v3.y,
pMy3DTriangle_Original[i].v3.z),
mRes);

pMy3DTriangle_Transformed[i].v3.x = v3.x;
pMy3DTriangle_Transformed[i].v3.y = v3.y;
pMy3DTriangle_Transformed[i].v3.z = v3.z;
}

//Screen Space transformation
for(int i = 0; i < 12; i++)
{
pMy3DTriangle_Transformed[i].vScreen1.x =   pMy3DTriangle_Transformed[i].v1.x * nViewWidth/2.0 + nViewWidth/2.0;
pMy3DTriangle_Transformed[i].vScreen1.y =  -pMy3DTriangle_Transformed[i].v1.y * nViewHeight/2.0 + nViewHeight/2.0;
  
pMy3DTriangle_Transformed[i].vScreen2.x =   pMy3DTriangle_Transformed[i].v2.x * nViewWidth/2.0 + nViewWidth/2.0;
pMy3DTriangle_Transformed[i].vScreen2.y =  -pMy3DTriangle_Transformed[i].v2.y * nViewHeight/2.0+ nViewHeight/2.0;
  
pMy3DTriangle_Transformed[i].vScreen3.x =   pMy3DTriangle_Transformed[i].v3.x * nViewWidth/2.0 + nViewWidth/2.0;
pMy3DTriangle_Transformed[i].vScreen3.y =  -pMy3DTriangle_Transformed[i].v3.y * nViewHeight/2.0+ nViewHeight/2.0;
}

And then I do draw triangle and cube.

Why vert v1y very much more change its value not within screen space? How do control this?





1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users