在线工具 在线编程 在线白板 在线工具 在线编程 在线白板

我在directX中设置了灯光,光照效果是有了,但是不正确。

全部源码不方便给出,只给一部分好了
D3DLIGHT9 dir;
ZeroMemory(&dir, sizeof(dir));
dir.Type = D3DLIGHT_POINT;
dir.Diffuse = D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
dir.Specular = D3DXCOLOR(0.3f,0.3f,0.3f,1.0f);
dir.Ambient = D3DXCOLOR(0.6f,0.6f,0.6f,1.0f);
dir.Position = D3DXVECTOR3(5.0f, 5.0f, 5.0f);
tdevice->SetLight(0, &dir);
tdevice->LightEnable(0, true);
//灯光(白色的)
D3DMATERIAL9 mtrl;
mtrl.Ambient = D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
mtrl.Diffuse = D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
mtrl.Specular = D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
mtrl.Emissive = D3DXCOLOR(0.0f,0.0f,0.0f,0.0f);
mtrl.Power = 5.0f;
//材质(白色的)
device->SetRenderState(D3DRS_LIGHTING, true);
device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
device->SetRenderState(D3DRS_NORMALIZENORMALS, true);
device->SetRenderState(D3DRS_SPECULARENABLE, true);
//设备设置
NormalVertex* vdb=new NormalVertex[12];
vdb[0] = NormalVertex(-1.0f, 0.0f, -1.0f, 0.0f, 0.707f, -0.707f);
vdb[1] = NormalVertex( 0.0f, 1.0f, 0.0f, 0.0f, 0.707f, -0.707f);
vdb[2] = NormalVertex( 1.0f, 0.0f, -1.0f, 0.0f, 0.707f, -0.707f);

vdb[3] = NormalVertex(-1.0f, 0.0f, 1.0f, -0.707f, 0.707f, 0.0f);
vdb[4] = NormalVertex( 0.0f, 1.0f, 0.0f, -0.707f, 0.707f, 0.0f);
vdb[5] = NormalVertex(-1.0f, 0.0f, -1.0f, -0.707f, 0.707f, 0.0f);

vdb[6] = NormalVertex( 1.0f, 0.0f, -1.0f, 0.707f, 0.707f, 0.0f);
vdb[7] = NormalVertex( 0.0f, 1.0f, 0.0f, 0.707f, 0.707f, 0.0f);
vdb[8] = NormalVertex( 1.0f, 0.0f, 1.0f, 0.707f, 0.707f, 0.0f);

vdb[9] = NormalVertex( 1.0f, 0.0f, 1.0f, 0.0f, 0.707f, 0.707f);
vdb[10] = NormalVertex( 0.0f, 1.0f, 0.0f, 0.0f, 0.707f, 0.707f);
vdb[11] = NormalVertex(-1.0f, 0.0f, 1.0f, 0.0f, 0.707f, 0.707f);
//顶点数组(模型显示正确的,在Lock方法和Unlock方法中的)
class Vertex
{
public:
Vertex(float _x=0, float _y=0, float _z=0);

float x, y, z;
static const DWORD FVF;
};
Vertex::Vertex(float _x, float _y, float _z):x(_x),y(_y),z(_z){};
const DWORD Vertex::FVF=D3DFVF_XYZ;
class NormalVertex:public Vertex
{
public:
float nx, ny, nz;
static const DWORD FVF;

NormalVertex(float _x=0, float _y=0, float _z=0, float _nx=0, float _ny=0, float _nz=0);
};
NormalVertex::NormalVertex(float _x, float _y, float _z, float _nx, float _ny, float _nz):Vertex(_x,_y,_z),nx(_nx),ny(_ny),nz(_nz){};
const DWORD NormalVertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL;
//顶点结构
/**/
FaceNum=4;
/**/
device->SetMaterial(Material);
device->SetStreamSource(0,VertexBuffer,0,sizeof(NormalVertex));
device->SetFVF(NormalVertex::FVF);
device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, FaceNum);
//绘制代码

有可能哪儿出问题呢?材质和灯光都是白色但是显示却是绿色和蓝色,总之很怪。
解决了追加分啊~
呵呵~多谢提醒啊~那是笔误~应是:
/**/
FaceNum=4;
/**/
device->SetMaterial(&mtrl);
device->SetStreamSource(0,VertexBuffer,0,sizeof(NormalVertex));
device->SetFVF(NormalVertex::FVF);
device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, FaceNum);
最新回答
长歌与行

2025-03-26 05:57:01

device->SetMaterial(Material);
这里设置的怎么不是上面的
//灯光(白色的)
D3DMATERIAL9 mtrl;
这个材质是写错了还是你的笔误?
小糊涂

2025-03-26 07:26:24

111ac