|
我初学D3D,现遇到一个问题,还请教各位高手帮我指点指定。
单独的光照效果和纹理效果我都已通过MSDN和网上的例子实现,现在想让二者共存,也就想让一个有纹理的圆筒,同时也有光照效果。
我的相关代码如下:
// D3DFVF_XYZ : 表示顶点坐标 D3DFVF_DIFFUSE : 表示顶点的颜色 D3DFVF_TEX1 : 表示有纹理
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
struct CUSTOMVERTEX//不知这里有无错,我多加了个法线,因为看MSND上说要有光照,就一定要有法线
{
D3DXVECTOR3 position; // 顶点坐标
D3DCOLOR color; // 顶点颜色
FLOAT tu, tv; // 贴图坐标
D3DXVECTOR3 normal; // 法线(用于光照)
};
。。。。。。。。。。。
//一个圆筒
CUSTOMVERTEX* pVertices;
if( FAILED( g_pVB->Lock( 0, 50*2*sizeof(CUSTOMVERTEX), (BYTE**)&pVertices, 0)))
return E_FAIL;
for( DWORD i=0; i<50; i++ )
{
FLOAT theta = (2*D3DX_PI*i)/(50-1);
pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) );
pVertices[2*i+0].color = 0xff000000;
pVertices[2*i+0].tu = ((FLOAT)i)/(50-1);
pVertices[2*i+0].tv = -1.0f;
pVertices[2*i+0].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );
pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );
pVertices[2*i+1].color = 0xff808080;
pVertices[2*i+1].tu = ((FLOAT)i)/(50-1);
pVertices[2*i+1].tv = 0.0f;
pVertices[2*i+1].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );
}
g_pVB->Unlock();
。。。。。。。
//从一个文件载入纹理
D3DXCreateTextureFromFile(g_pd3dDevice,"C:\\红.bmp",&g_pTexture);
// 指定纹理
g_pd3dDevice->SetTexture(0, g_pTexture );
g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
。。。。。。。。。
//渲染
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,255), 1.0f, 0);
g_pd3dDevice->BeginScene();
//设置灯光
SetLight();
//设置观察点等和摄象机有关的东东
SetView();
//设置数据源
g_pd3dDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX));
//指定自定义的FVF
g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2*50-2);
g_pd3dDevice->EndScene();
g_pd3dDevice-> resent( NULL, NULL, NULL, NULL );
程序运行结果总是和我预想的不正确,总是没有光照效果,请各位高手帮我看看,是哪儿错了,谢谢! |
|