我希望能够以有效的方式在程序中设置后台缓冲区的各个像素。这就是我在渲染函数中所说的:
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为什么会失败?
答案 0 :(得分:3)
为了锁定后台缓冲区,您需要在创建设备时指定一个标志:
D3DPRESENT_PARAMETERS d3dpp;
(...)
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
但是,正如Direct3D规范中所规定的那样,这可能严重损害性能。你应该绘制纹理三角形。