关于DirectX3D顶点格式D3DFVF_XYZRHW

    D3DFVF_XYZ和D3DFVF_XYZRHW有什么区别?以前好像没有仔细思考过,只是见到Beginning DirectX9中如是说:The RHW value, which stands for Reciprocal of Homogeneous W[1], tells Direct3D that the vertices that are being used are already in screen coordinates. This value is normally used in fog and clipping calculations and should be set to 1.0.

    今天,做了个实验得知,在顶点结构体中没有RHW时,Direct3D将执行视、投影、世界等变换以及进行光线计算,之后你才能在窗口中得到你所绘制的物体。当顶点结构体中有RHW时,就像上面那段英文所述,告知Direct3D使用的顶点已经在屏幕坐标系中了,不再执行视图、投影、世界等变换和光线计算,因为D3DFVF_XYZRHW标志告诉它顶点已经经过了这些处理,并直接将顶点进行光栅操作,任何用SetTransform进行的转换都对其无效。不过这时的原点就在客户区的左上角了,其中x向右为正,y向下为正,而z的意义已经变为z-buffer的象素深度。

    值得注意的是,D3DFVF_XYZRHW和D3DFVF_XYZ、D3DFVF_NORMAL不能共存,因为后两个标志与前一个矛盾。在使用这种顶点时,系统需要顶点的位置已经经过变换了,也就是说x、y必须在屏幕坐标系中,z必须是z-buffer中的象素深度,取值范围:0.0-1.0,离观察者最近的地方为0.0,观察范围内最远可见的地方为1.0[2]。

_______________________

[1] RHW表示投影空间中顶点所在的齐次点(x,y,z,w)(homogeneous point)的w坐标的倒数(reciprocal)。

[2] 可以通过用以下顶点结构,在程序中创建x,y相同但z分别为0.0f和1.0f的两个带颜色的点来看看哪个颜色的点被哪个颜色的点遮挡,然后交换两点的z值看看情况又是如何。

// Custome Color Vertex
struct ColorVertex
{
    float x;
    float y;
    float z;
    float rhw;
    float psize;
    DWORD color;
    const static DWORD FVF;
};
const DWORD ColorVertex::FVF = D3DFVF_XYZRHW | D3DFVF_PSIZE | D3DFVF_DIFFUSE;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在你的项目中包含以下头文件: ``` #include <d3d9.h> #include <d3dx9.h> ``` 然后,创建一个 Direct3D 接口对象: ``` LPDIRECT3D9 d3d = Direct3DCreate9(D3D_SDK_VERSION); ``` 接下来,创建一个 Direct3D 设备: ``` LPDIRECT3DDEVICE9 d3ddev; d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev); ``` 在这里,`hwnd` 是窗口句柄,`d3dpp` 是一个 `D3DPRESENT_PARAMETERS` 结构体,它包含了一些设备的参数,比如屏幕大小、刷新率等等。 现在,你可以开始绘制了。首先,清除屏幕: ``` d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0); ``` 这会将屏幕清除为蓝色。现在,开始渲染: ``` d3ddev->BeginScene(); // 绘制代码在这里 d3ddev->EndScene(); ``` 在 `BeginScene()` 和 `EndScene()` 之间的代码就是你的绘制代码了。比如,你可以创建一个三角形: ``` struct Vertex { FLOAT x, y, z; DWORD color; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE) Vertex vertices[] = { { 150.0f, 50.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0) }, { 250.0f, 250.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0) }, { 50.0f, 250.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255) }, }; LPDIRECT3DVERTEXBUFFER9 buffer; d3ddev->CreateVertexBuffer(3 * sizeof(Vertex), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &buffer, NULL); VOID* pVertices; buffer->Lock(0, sizeof(vertices), (void**)&pVertices, 0); memcpy(pVertices, vertices, sizeof(vertices)); buffer->Unlock(); d3ddev->SetStreamSource(0, buffer, 0, sizeof(Vertex)); d3ddev->SetFVF(D3DFVF_CUSTOMVERTEX); d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); ``` 这会在屏幕上绘制一个彩色的三角形。 最后,别忘了在程序结束时释放 Direct3D 设备和接口对象: ``` d3ddev->Release(); d3d->Release(); ``` 这就是在火山PC上使用D3D绘制的基本流程。当然,这只是一个简单的例子,你可以通过学习更多的Direct3D相关知识,来实现更复杂的图形效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值