|
|
整理一下逻辑
首先
初始化
得到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-> resent(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 都没任何变化
我想是不是我的光没有参与运算? 是不是要设置个什么东西? |
|