在Back Buffer上设置单个像素

时间:2010-08-31 06:48:18

标签: c++ direct3d

我希望能够以有效的方式在程序中设置后台缓冲区的各个像素。这就是我在渲染函数中所说的:

void render_frame(void)
{
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);

    d3ddev->BeginScene();

    d3ddev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &surface);
    D3DLOCKED_RECT locked;
    surface->LockRect(&locked, NULL, 0);
    *(BYTE*)locked.pBits=42;
    surface->UnlockRect();
    surface->Release();

    d3ddev->EndScene();

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

}

然而它总是崩溃。如果我注释掉我将第一个字节分配给42的部分,它就不会崩溃。那么我做错了什么,我不应该能够将值分配给bPits指向的缓冲区,因为表面被锁定了吗?

刚刚发现locked.pBits是一个空指针。那么LockRect为什么会失败?

1 个答案:

答案 0 :(得分:3)

为了锁定后台缓冲区,您需要在创建设备时指定一个标志:

D3DPRESENT_PARAMETERS d3dpp;
(...)
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

但是,正如Direct3D规范中所规定的那样,这可能严重损害性能。你应该绘制纹理三角形。