Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在后缓冲区上设置单个像素_C++_Direct3d - Fatal编程技术网

C++ 在后缓冲区上设置单个像素

C++ 在后缓冲区上设置单个像素,c++,direct3d,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, &

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

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失败了?

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

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

但是,正如Direct3D规范中所规定的,这可能会严重影响性能。你应该画有纹理的三角形。

谢谢。但是,你知道这会影响表演的原因吗?对于绘制带纹理的三角形,我想象它必须先进行一些处理,然后再编辑后缓冲区,而我试图做的是跳过第一步,只编辑它。为什么这会降低效率?这会影响性能,因为必须将后缓冲区表面从GPU下载到CPU,然后重新上载到GPU。它还将打破流:图形API的设计方式允许在不直接执行渲染命令的情况下发出渲染命令,以提高性能。