游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2215|回复: 2

打了灯光,为什么我的地形出不了阴影效果

[复制链接]

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2010-1-6 18:57:00 | 显示全部楼层 |阅读模式
整理一下逻辑
首先

初始化  
得到D3D指针m_pD3D 然后获得显示模式 m_pD3D->GetAdapterDisplayMode
顺便在这里设置全屏或者窗口什么的
然后m_pD3D->CreateDevice  得到m_pD3DDevice

然后初始化了 一些 类的指针
在每个类 new 的时候顺便把m_pD3DDevice赋值过去了
字体类 (我没有去获得input的接口什么的,直接用的D3D字体类,我只需要显示几个简单的字)
相机类
2D类(我在鼠标的位置画了一个圆)
地形类 (得到地形类的指针后顺便读取了纹理);


获得这些类的借口指针后 我就初始化了灯光InitializeLights()
(我即使把这里注释掉 也可以出来看到地形。。没任何变化)
InitializeLights()
{
ZeroMemory(&d3dLight, sizeof(D3DLIGHT9));

//Set up a white point light at (0, 0, -10).
d3dLight.Type = D3DLIGHT_DIRECTIONAL;

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

d3dLight.Ambient.r = 0.0f;
d3dLight.Ambient.g = 0.0f;
d3dLight.Ambient.b = 0.0f;

d3dLight.Specular.r = 0.0f;
d3dLight.Specular.g = 0.0f;
d3dLight.Specular.b = 0.0f;

d3dLight.Position.x = 10.0f;
d3dLight.Position.y = 10.0f;
d3dLight.Position.z = -20.0f;

d3dLight.Attenuation0 = 1.0f;
d3dLight.Attenuation1 = 0.0f;
d3dLight.Attenuation2 = 0.0f;
d3dLight.Range = 100.0f;

//Assign the point light to our device in poisition (index) 0
m_pD3DDevice->SetLight(0, &d3dLight);


//Enable our point light in position (index) 0
m_pD3DDevice->LightEnable(0, true);

//Set ambient light level
m_pD3DDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(32, 32, 32));
return true;
}
这里用的环境光。我也不知道地形用什么光线。电光源?射线光?

在回调函数里面调用了渲染RenderScene();
RenderScene()
{
IsKeyPressed();  //判断适口有鼠标或者键盘按下
m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(150, 50, 150), 1.0f, 0);
m_pD3DDevice->BeginScene();

m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); //开ALPHA混合
m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
pCamera->Setup3DCamera();  //设置摄像机
pTerrain->Render(); //渲染地形

pick(hwnd); //鼠标拾取 把屏幕鼠标转换成3D坐标系中的位置
Render2D(); //根据鼠标在3D坐标系中的位置画一个2D 的圆
RenderFont(); //渲染字体
m_pD3DDevice->EndScene();
m_pD3DDevice-&gtresent(NULL, NULL, NULL, NULL);
}

Setup3DCamera()的时候 没什么好说的 设置了这个
m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

地形渲染的时候
首先在构造函数里面初始化了一些数值
在地形类的构造函数里面把顶点数组所有东西初始化为0
顶点格式为
#define D3DTERRAIN_VERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX2 |D3DFVF_TEXCOORDSIZE4(3))

struct VERTEX_STYLE
{
D3DXVECTOR3 pos ;
D3DXVECTOR3 normal;
D3DXVECTOR3 tex0; //纹理坐标的Z 为权值
D3DXVECTOR3 tex1; //
};
创建了 m_pD3DDevice->CreateVertexBuffer(这个时候并没有计算好每个顶点的信息)
然后m_pD3DDevice->CreateIndexBuffer(设置好了索引的顺序)

最后在地形类的构造函数里面设置了材质
D3DCOLORVALUE rgbaDiffuse = {1.0f, 1.0f, 1.0f, 0.0f,};
D3DCOLORVALUE rgbaAmbient = {0.2f, 0.2f, 0.2f, 1.0f,};
D3DCOLORVALUE rgbaSpecular = {0.0f, 0.0f, 0.0f, 0.0f,};
D3DCOLORVALUE rgbaEmissive = {0.5f, 0.5f, 0.5f, 0.0f,};

SetMaterial(rgbaDiffuse, rgbaAmbient, rgbaSpecular, rgbaEmissive, 0);
这些都是在构造函数里面完成的

在读取纹理的时候 创建了 pixel shader
设置顶点信息的时候 先计算了顶点坐标 纹理坐标 和纹理权值 然后再设置的法线向量
渲染
渲染的时候 调用了设置顶点信息(因为这些纹理 顶点坐标我通过鼠标有可能改变)
然后
if(m_pD3DDevice == NULL)
{
return;
}
if(m_pTerrainTexture0 != NULL)
{
  m_pD3DDevice->SetTexture(0,  m_pTerrainTexture0);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
}
else
{
m_pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE);
}
if(m_pTerrainTexture1 != NULL)
{
m_pD3DDevice->SetTexture(1,  m_pTerrainTexture1);

m_pD3DDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pD3DDevice->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_pD3DDevice->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

}
else
{
m_pD3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
}

m_pD3DDevice->SetPixelShader(MultiTexPS);
m_pD3DDevice->SetVertexDeclaration(pVertexDel);
//m_pD3DDevice->SetFVF(D3DTERRAIN_VERTEX);
m_pD3DDevice->SetStreamSource(0, m_pD3DVertexbuffer, 0,sizeof(VERTEX_STYLE));


m_pD3DDevice->SetIndices(m_pIndexBuffer);
m_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0, 0, (Vertical_NUM+1)*(Horizontal_NUM+1),0,Vertical_NUM*Horizontal_NUM *2);
m_pD3DDevice->SetMaterial(&m_matMaterial);

其他的地方没有设置什么
SetSamplerState textrueState 什么的
在代码中出现的 m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);改成false 也不影响最后结果
改变光的范围 或者是Ambient 都没任何变化

我想是不是我的光没有参与运算? 是不是要设置个什么东西?

0

主题

18

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2010-1-6 21:44:00 | 显示全部楼层

Re:打了灯光,为什么我的地形出不了阴影效果

在 m_pD3DDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(32, 32, 32)); 前面加一句
m_pD3DDevice->SetRenderState( D3DRS_LIGHTING, TRUE );试一下

还有,试下先设置材质,再设置灯光。

10

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2010-1-7 22:00:00 | 显示全部楼层

Re:打了灯光,为什么我的地形出不了阴影效果

把m_pD3DDevice->SetMaterial(&m_matMaterial); 放到DrawIndexedPrimitive()之前。

在绘制之前要把所有东西都设置好,绘制图元是最后的步骤。照你贴出来的代码运行的话,你渲染的地形会采用默认的材质,而不是你所设置的材质,所以你看不到任何的光照变化。使用Draw**()之后绘制出来的东西都保存在后台缓冲区中,也是我们最终想要的东西。
你如果把m_pD3DDevice->SetMaterial(&m_matMaterial); 放在Draw**()之后的话,相当于为下一个将要执行的Draw**()指明材质属性。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-17 02:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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