程序生成了一个U形的连续面。大概样子如下图。
令我无法理解的是两个对称的面上明暗竟不一样!
下图是 将U形的模型前后旋转后的效果。同样的位置两个面表现出来的效果不一样?!!
代码如下 :
生成VB:
int
iCount
=
6
;
if ( FAILED( lpDevice -> CreateVertexBuffer( 2 * iCount * sizeof (D3DVERTEX), 0 ,D3DVERTEX::FVF,D3DPOOL_SYSTEMMEM, & g_pVB,NULL ) ) )
return false ;
D3DVERTEX * pVertex;
if ( FAILED( g_pVB -> Lock( 0 , 2 * iCount * sizeof (D3DVERTEX),( void ** ) & pVertex, 0 ) ) )
... {
SAFE_RELEASE( g_pVB );
return false;
}
D3DXVECTOR3 vec3;
int i = 0 ;
pVertex[i].p = D3DXVECTOR3( 0 , - 10 , 0 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , - 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 0 , 0 , 0 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , - 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 10 , - 10 , 0 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , - 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 10 , 0 , 0 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , - 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 20 , - 10 , 0 );
vec3 = D3DXVECTOR3( 1.0f , 0 , - 1.0f );
D3DXVec3Normalize( & pVertex[i].n , & vec3 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 20 , 0 , 0 );
vec3 = D3DXVECTOR3( 1.0f , 0 , - 1.0f );
D3DXVec3Normalize( & pVertex[i].n , & vec3 );
i ++ ;
/**/ ///
pVertex[i].p = D3DXVECTOR3( 20 , - 10 , 10 );
vec3 = D3DXVECTOR3( 1.0f , 0 , 1.0f );
D3DXVec3Normalize( & pVertex[i].n , & vec3 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 20 , 0 , 10 );
vec3 = D3DXVECTOR3( 1.0f , 0 , 1.0f );
D3DXVec3Normalize( & pVertex[i].n , & vec3 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 10 , - 10 , 10 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 10 , 0 , 10 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 0 , - 10 , 10 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 0 , 0 , 10 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , 1 );
g_pVB -> Unlock();
if ( FAILED( lpDevice -> CreateVertexBuffer( 2 * iCount * sizeof (D3DVERTEX), 0 ,D3DVERTEX::FVF,D3DPOOL_SYSTEMMEM, & g_pVB,NULL ) ) )
return false ;
D3DVERTEX * pVertex;
if ( FAILED( g_pVB -> Lock( 0 , 2 * iCount * sizeof (D3DVERTEX),( void ** ) & pVertex, 0 ) ) )
... {
SAFE_RELEASE( g_pVB );
return false;
}
D3DXVECTOR3 vec3;
int i = 0 ;
pVertex[i].p = D3DXVECTOR3( 0 , - 10 , 0 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , - 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 0 , 0 , 0 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , - 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 10 , - 10 , 0 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , - 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 10 , 0 , 0 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , - 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 20 , - 10 , 0 );
vec3 = D3DXVECTOR3( 1.0f , 0 , - 1.0f );
D3DXVec3Normalize( & pVertex[i].n , & vec3 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 20 , 0 , 0 );
vec3 = D3DXVECTOR3( 1.0f , 0 , - 1.0f );
D3DXVec3Normalize( & pVertex[i].n , & vec3 );
i ++ ;
/**/ ///
pVertex[i].p = D3DXVECTOR3( 20 , - 10 , 10 );
vec3 = D3DXVECTOR3( 1.0f , 0 , 1.0f );
D3DXVec3Normalize( & pVertex[i].n , & vec3 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 20 , 0 , 10 );
vec3 = D3DXVECTOR3( 1.0f , 0 , 1.0f );
D3DXVec3Normalize( & pVertex[i].n , & vec3 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 10 , - 10 , 10 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 10 , 0 , 10 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 0 , - 10 , 10 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , 1 );
i ++ ;
pVertex[i].p = D3DXVECTOR3( 0 , 0 , 10 );
pVertex[i].n = D3DXVECTOR3( 0 , 0 , 1 );
g_pVB -> Unlock();
渲染:
pd3dDevice
->
SetRenderState( D3DRS_SHADEMODE,D3DSHADE_FLAT );
if ( g_pVB )
... {
pd3dDevice->SetStreamSource( 0,g_pVB,0,sizeof(D3DVERTEX) );
pd3dDevice->SetFVF( D3DVERTEX::FVF );
pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,0,10 );
}
if ( g_pVB )
... {
pd3dDevice->SetStreamSource( 0,g_pVB,0,sizeof(D3DVERTEX) );
pd3dDevice->SetFVF( D3DVERTEX::FVF );
pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,0,10 );
}
不如哪位高手可以指点一下?!