游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3109|回复: 8

如何让设置的光源照过物体后不带影子

[复制链接]

17

主题

282

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
发表于 2007-10-21 22:46:00 | 显示全部楼层 |阅读模式
我借用的例子里面的函数

VOID SetupLights()
{
        //    创建材质(material)
        // 在设备中创建一个材质.
        D3DMATERIAL9 mtrl;
        ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
        mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
        mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
        mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
        mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
        g_pd3dDevice->SetMaterial( &mtrl );

        //  创建光源
        D3DXVECTOR3 vecDir;                                                                        /// 方向光源(directional light)照射的方向
        D3DLIGHT9 light;                                                                        /// 光源结构体
        ZeroMemory( &light, sizeof(D3DLIGHT9) );                        /// 将结构体清零.
        light.Type       = D3DLIGHT_DIRECTIONAL;                        /// 光源类型(点光源、方向光源、聚光光源)
        light.Diffuse.r  = 1.0f;                                                        /// 光源的颜色和亮度
        light.Diffuse.g  = 1.0f;
        light.Diffuse.b  = 1.0f;
        //light.Position = D3DXVECTOR3(200.0f,200.0f,-100.0f);
        vecDir = D3DXVECTOR3(-200.0f,        /// 光源的方向
                -800.0f,
                600.0f );
        D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );        /// 光源的方向设定为单位向量.
        light.Range       = 10000.0f;                                                                        /// 光源能够照射到的最远距离
        g_pd3dDevice->SetLight( 0, &light );                                                        /// 在设备设置0号光源
        g_pd3dDevice->LightEnable( 0, TRUE );                                                        /// 打开0号光源
        g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );                        /// 打开光源设置

        g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );                /// 设定环境光源(ambient light)的值
}



如何修改才能使物体有反光但没阴影?

0

主题

34

帖子

46

积分

注册会员

Rank: 2

积分
46
QQ
发表于 2007-10-21 23:49:00 | 显示全部楼层

Re:如何让设置的光源照过物体后不带影子

light.Ambient.r  = 0.?f; /// 颜色
light.Ambient.g  = 0.?f;
light.Ambient.b  = 0.?f;

mtrl.Diffuse.r =0.0f;
mtrl.Diffuse.g = 0.0f;
mtrl.Diffuse.b = 0.0f;
mtrl.Diffuse.a = 0.0f;

Ambient环境光是跟发向无关的
然后你的Specular也要填颜色
就在环境光基础上有高光了

不知道我理解的对不对

17

主题

282

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
 楼主| 发表于 2007-10-22 00:56:00 | 显示全部楼层

Re:如何让设置的光源照过物体后不带影子

请问specular是给light还是mtrl设定?

17

主题

282

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
 楼主| 发表于 2007-10-22 01:02:00 | 显示全部楼层

Re:如何让设置的光源照过物体后不带影子

我改成
D3DMATERIAL9 mtrl;
        ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
        mtrl.Diffuse.r = mtrl.Ambient.r = mtrl.Specular.r=0.0f;
        mtrl.Diffuse.g = mtrl.Ambient.g = mtrl.Specular.g=0.0f;
        mtrl.Diffuse.b = mtrl.Ambient.b = mtrl.Specular.b= 0.0f;
        mtrl.Diffuse.a = mtrl.Ambient.a =mtrl.Specular.a=  0.0f;
        g_pd3dDevice->SetMaterial( &mtrl );

        //  创建光源
        D3DXVECTOR3 vecDir;                                                                        /// 方向光源(directional light)照射的方向
        D3DLIGHT9 light;                                                                        /// 光源结构体
        ZeroMemory( &light, sizeof(D3DLIGHT9) );                        /// 将结构体清零.
        light.Type       = D3DLIGHT_DIRECTIONAL;                        /// 光源类型(点光源、方向光源、聚光光源)
        light.Diffuse.r  = 0.0f;                                                        /// 光源的颜色和亮度
        light.Diffuse.g  = 0.0f;
        light.Diffuse.b  = 0.0f;
        light.Specular.r = 0.0f;
        light.Specular.g = 0.0f;
        light.Specular.b = 0.0f;
        light.Specular.a = 0.0f;

        //light.Position = D3DXVECTOR3(200.0f,200.0f,-100.0f);
        vecDir = D3DXVECTOR3(-200.0f,        /// 光源的方向
                -800.0f,
                600.0f );
        D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );        /// 光源的方向设定为单位向量.
        light.Range       = 10000.0f;                                                                        /// 光源能够照射到的最远距离
        g_pd3dDevice->SetLight( 0, &light );                                                        /// 在设备设置0号光源
        g_pd3dDevice->LightEnable( 0, TRUE );                                                        /// 打开0号光源
        g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );                        /// 打开光源设置

我导入的是一个.x的球
球表面上还是没有高光的部分。。

3

主题

53

帖子

104

积分

注册会员

Rank: 2

积分
104
发表于 2007-10-22 13:40:00 | 显示全部楼层

Re:如何让设置的光源照过物体后不带影子

DX中默认高光是关闭的,需要
g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, TRUE);

0

主题

34

帖子

46

积分

注册会员

Rank: 2

积分
46
QQ
发表于 2007-10-22 13:58:00 | 显示全部楼层

Re:如何让设置的光源照过物体后不带影子

LZ颜色全0.0就黑了吧
Ambient填个不是0的值
Specular一般填 1.0,1.0,1.0吧

0

主题

34

帖子

46

积分

注册会员

Rank: 2

积分
46
QQ
发表于 2007-10-22 14:01:00 | 显示全部楼层

Re:如何让设置的光源照过物体后不带影子

还有最终颜色是材质和光源颜色的乘积light和mtrl任何一个全0就黑了
Ambient和Diffuse和Specular之间是加法

17

主题

282

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
 楼主| 发表于 2007-10-22 23:24:00 | 显示全部楼层

Re:如何让设置的光源照过物体后不带影子

郁闷了 又改了

VOID SetupLights()
{
        //    创建材质(material)
        // 在设备中创建一个材质.
        D3DMATERIAL9 mtrl;
        ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
        mtrl.Specular.r=1.0f;
        mtrl.Specular.g=1.0f;
        mtrl.Specular.b= 1.0f;
        mtrl.Specular.a=  1.0f;
        mtrl.Ambient.a=mtrl.Ambient.g=mtrl.Ambient.b=mtrl.Ambient.r=0.5f;
        mtrl.Diffuse.a=mtrl.Diffuse.r=mtrl.Diffuse.g=mtrl.Diffuse.b=0.1f;
        mtrl.Emissive.a=mtrl.Emissive.g=mtrl.Emissive.r=mtrl.Emissive.b=0.1f;
        mtrl.Power=5.0f;
        g_pd3dDevice->SetMaterial( &mtrl );

        //  创建光源
        D3DXVECTOR3 vecDir;                                                                        /// 方向光源(directional light)照射的方向
        D3DLIGHT9 light;                                                                        /// 光源结构体
        ZeroMemory( &light, sizeof(D3DLIGHT9) );                        /// 将结构体清零.
        light.Type       = D3DLIGHT_DIRECTIONAL;                        /// 光源类型(点光源、方向光源、聚光光源)
        light.Diffuse.r  = 0.5f;                                                        /// 光源的颜色和亮度
        light.Diffuse.g  = 0.5f;
        light.Diffuse.b  = 0.5f;
        light.Specular.r = 1.0f;
        light.Specular.g = 1.0f;
        light.Specular.b = 1.0f;
        light.Specular.a = 1.0f;
        light.Ambient.a=light.Ambient.r=light.Ambient.g=light.Ambient.b=0.6f;

        vecDir = D3DXVECTOR3(-200.0f,        /// 光源的方向
                -800.0f,
                600.0f );
        D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );        /// 光源的方向设定为单位向量.
        light.Range       = 10000.0f;                                                                        /// 光源能够照射到的最远距离
        g_pd3dDevice->SetLight( 0, &light );                                                        /// 在设备设置0号光源
        g_pd3dDevice->LightEnable( 0, TRUE );                                                        /// 打开0号光源
        g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );                        /// 打开光源设置
        g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);
        g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE,true);
}


还是看不到高光
难道和导入.x文件时读取材质属性有关?

17

主题

282

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
 楼主| 发表于 2007-10-23 21:43:00 | 显示全部楼层

Re:如何让设置的光源照过物体后不带影子

究竟具体应该怎么设置环境光和光源的参数才能使一个.x的球产生高光?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-20 04:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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