游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5051|回复: 12

D3D中的光照效果和纹理效果???

[复制链接]

7

主题

30

帖子

46

积分

注册会员

Rank: 2

积分
46
QQ
发表于 2004-7-20 15:11:00 | 显示全部楼层 |阅读模式
我初学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-&gtresent( NULL, NULL, NULL, NULL );       

程序运行结果总是和我预想的不正确,总是没有光照效果,请各位高手帮我看看,是哪儿错了,谢谢!

62

主题

296

帖子

302

积分

中级会员

Rank: 3Rank: 3

积分
302
QQ
发表于 2004-7-20 16:59:00 | 显示全部楼层

Re:D3D中的光照效果和纹理效果???

g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
不知道你有没有加?我也很菜的,只知道这个了。以后一起加油呀。

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2004-7-20 18:18:00 | 显示全部楼层

Re:D3D中的光照效果和纹理效果???

我还不会D3D呢。。。不过你有设置过光源了嘛?

9

主题

198

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2004-7-20 18:52:00 | 显示全部楼层

Re:D3D中的光照效果和纹理效果???

// D3DFVF_XYZ : 表示顶点坐标  D3DFVF_DIFFUSE : 表示顶点的颜色  D3DFVF_TEX1 : 表示有纹理     ????????:表示定点的法线
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)

问题应该在这里。如果你还是找不到的话,告诉我。

62

主题

296

帖子

302

积分

中级会员

Rank: 3Rank: 3

积分
302
QQ
发表于 2004-7-20 19:06:00 | 显示全部楼层

Re:D3D中的光照效果和纹理效果???

D3DFVF_NORMAL

9

主题

198

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2004-7-20 19:16:00 | 显示全部楼层

Re:D3D中的光照效果和纹理效果???

You are right

7

主题

30

帖子

46

积分

注册会员

Rank: 2

积分
46
QQ
 楼主| 发表于 2004-7-21 09:16:00 | 显示全部楼层

Re:D3D中的光照效果和纹理效果???

很感谢大家的回答,不过我的问题还没解决,我尝试在程序中加入了D3DFVF_NORMAL标志。即:
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1|D3DFVF_NORMAL)
但还是没有出现光照效果,并且多了这标志以后,圆筒表面帖上去的纹理也变得正确了。不知是怎么回事?
下面这代码是我设置光的代码,昨天没有帖这部分。因为我估计不是这部分出问题,今天把这部分帖出来,让大家看看是否这部分出错了。
void CD3dDlg::SetLight()
{
        //建立表面质材(即反光率)
        D3DMATERIAL8 mtrl;
        ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) );
        mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
        mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
        mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
        mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
        g_pd3dDevice->SetMaterial( &mtrl );

        //建立白色的灯光
        D3DXVECTOR3 vecDir;
        D3DLIGHT8 light;
        ZeroMemory( &light, sizeof(D3DLIGHT8) );
        light.Type = D3DLIGHT_DIRECTIONAL;

        light.Diffuse.r = 1.0f;
        light.Diffuse.g = 1.0f;
        light.Diffuse.b = 1.0f;

        //设置光源照射半径
        vecDir = D3DXVECTOR3(cosf(timeGetTime()/360.0f),
                     0.0f,
                     sinf(timeGetTime()/360.0f) );
        D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );

        light.Range = 1000.0f;

        g_pd3dDevice->SetLight( 0, &light );
        g_pd3dDevice->LightEnable( 0, TRUE);
        g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);

        //打开少许环境光
        g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );       
}

还希望有这方面经验的朋友指点一下。
我的MSN:gsq547@hotmail.com

62

主题

296

帖子

302

积分

中级会员

Rank: 3Rank: 3

积分
302
QQ
发表于 2004-7-21 09:25:00 | 显示全部楼层

Re:D3D中的光照效果和纹理效果???

建议先把DXSDK的例子完整地拷贝下来,然后一点一点去掉你可以去掉的东西,或者一点一点加上你认为可以加的东西,这样学起来比较快!
你这样手动建立代码,比较容易犯一些很莫名其妙的错误

16

主题

72

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2004-7-21 15:06:00 | 显示全部楼层

Re:D3D中的光照效果和纹理效果???

struct CUSTOMVERTEX//不知这里有无错,我多加了个法线,因为看MSND上说要有光照,就一定要有法线
{
D3DXVECTOR3 position; // 顶点坐标
D3DCOLOR color; // 顶点颜色
FLOAT tu, tv; // 贴图坐标
D3DXVECTOR3 normal; // 法线(用于光照)
};

应该是有顺序的吧,应该是
struct CUSTOMVERTEX//不知这里有无错,我多加了个法线,因为看MSND上说要有光照,就一定要有法线
{
D3DXVECTOR3 position; // 顶点坐标
D3DXVECTOR3 normal; // 法线(用于光照)
D3DCOLOR color; // 顶点颜色
FLOAT tu, tv; // 贴图坐标
};


MS DirectX的FVF是有顺序的

9

主题

198

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2004-7-21 16:52:00 | 显示全部楼层

Re:D3D中的光照效果和纹理效果???

你如何看出没有灯光效果?

->HappyGamer
FVF的顺序是根据你定义的定点(vertex)结构的顺序决定的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-4 00:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表