D3D画线的颜色问题

xiaolizi 2003-06-15 08:07:31

我想在3D场景中画线,可是没有颜色(黑色)。我不知道哪儿弄错了。

另外D3DFVF_XYZRHW这个FVF标志是什么意思呢?MSDN上这么说
Vertex format includes the position of a transformed vertex. This flag cannot be used with the D3DFVF_XYZ or D3DFVF_NORMAL flags.
我还是不明白,transformed vertex到底是指什么?


根据例子,我是这么做的


#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL; // Buffer to hold vertices

struct CUSTOMVERTEX
{
FLOAT x, y, z; // The transformed position for the vertex.
DWORD colour; // The vertex colour.
};

HRESULT InitialiseVertexBuffer()
{
VOID* pVertices;

//Store each point of the triangle together with it's colour
CUSTOMVERTEX cvVertices[] =
{
{0.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255),}, {20.0f,0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255),},
{0.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0),},
{0.0f,20.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255),},
{0.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0),},
{0.0f, 0.0f,20.0f, D3DCOLOR_XRGB(0, 0, 255),},
};

//Create the vertex buffer from our device
if(FAILED(g_d3ddevice.GetObject()->CreateVertexBuffer(6 * sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVertexBuffer,0)))
{
return E_FAIL;
}

if(FAILED(g_pVertexBuffer->Lock(0, sizeof(cvVertices), (void**)&pVertices, 0)))
{
return E_FAIL;
}

//Copy our stored vertices values into the vertex buffer
memcpy(pVertices, cvVertices, sizeof(cvVertices));

//Unlock the vertex buffer
g_pVertexBuffer->Unlock();

return S_OK;
}


void Render()
{
dev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);


dev->BeginScene();

D3DXMATRIX world_mat;
D3DXMatrixIdentity(&world_mat);

dev->SetTransform(D3DTS_WORLD, &world_mat);
dev->SetStreamSource(0, g_pVertexBuffer,0,sizeof(CUSTOMVERTEX));
dev->SetFVF(D3DFVF_CUSTOMVERTEX);
dev->DrawPrimitive(D3DPT_LINELIST, 0, 3);

dev->EndScene();

dev->Present(NULL, NULL, NULL, NULL);

}


...全文
246 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaolizi 2003-06-22
  • 打赏
  • 举报
回复
多谢 YangLin1ST(杨家枪法第六十七代传人) 和 Nhsoft(我不是高手) 两位大哥。
最近看了SDK文档关于Matrerial,Lighting部分的内容,收获挺大的,在此谢乐 ^_^

另外可以将一下T&L管道是什么吗?还有之前好像看到有TLVertex什么的。。。
YangLin1ST 2003-06-22
  • 打赏
  • 举报
回复
Transform就是真实世界坐标转化为电脑屏幕能呈现的方式的过程,它决定哪些物体会被绘制在一个画面上;而Lighting则是依据目前空间中存在的光源数量、目前材质的属性以及与环境光源的种类设定,计算出3D物体受光与材质的混合效应。T&L是创造真实3D画面的重要步骤,由于这个步骤很吃CPU资源,所以现在流行的是硬件级别的T&L,它替代了CPU的大部分工作,让显示芯片帮助CPU处理,减轻了后者的负担。
潘李亮 2003-06-20
  • 打赏
  • 举报
回复
记得还要清除深度缓冲区--要是你创建了它的话
潘李亮 2003-06-20
  • 打赏
  • 举报
回复
transformed vertex就是说一个顶点的数据已经是经过T&L变换的了,不再需要送到T&L管道的了。你指定的位置和光照就是最终的光照和位置。
所以它不能和D3DFVF_NORMAL和D3DFVF_XYZ一起使用。
YangLin1ST 2003-06-18
  • 打赏
  • 举报
回复
开灯的时候,Vertex的颜色是按照 Material 来计算的,如果FVF中没有包含法向量,画出来的图像就是一块,没有明暗的区别。这是可以使用
SetRenderState(D3DRS_NORMALIZENORMALS ,TRUE);让其自动产生法向量,画出来的图像就对了,但是这样速度很慢,实际中最好不要这样用
关灯的时候,颜色是按照DIFFUSE来计算的,这时
SetMaterial() 是没有用处的。
xiaolizi 2003-06-17
  • 打赏
  • 举报
回复
thanks to YangLin1ST(杨家枪法第六十七代传人) ,fastbit(大罗)

确实是这个样子,我这样理解不知道不对不。

因为有灯存在3D场景中,所以根据以上的FVF,Vertex的颜色计算需要根据Vertex的法向量来算。因为点没有法向量所以无法计算颜色,是不是这个样子?
fastbit 2003-06-16
  • 打赏
  • 举报
回复
// must turn off d3d lighting
gpDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
YangLin1ST 2003-06-16
  • 打赏
  • 举报
回复
D3DFVF_XYZRHW 表示数据中包含了X,Y(相对于屏幕),和点的深度值Z(就是Z-BUFFER中的Z),
把光线关掉就可以看到颜色.

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧