如何设置 Direct3D 纹理中单个像素的颜色?

Fur*_*der 5 c++ directx graphics direct3d

我正在尝试在 Direct3D 中将 2D 图像绘制到屏幕上,我假设必须通过将纹理映射到投影以填充屏幕的矩形广告牌多边形来完成。(我不感兴趣或不能使用 Direct2D。)我在 SDK 中找到的所有纹理信息都描述了从文件加载位图并分配纹理以使用该位图,但我还没有找到操作的方法一个像素一个像素的位图纹理。

我真正想要的是一个函数,例如

void TextureBitmap::SetBitmapPixel(int x, int y, DWORD color);

如果我不能直接在纹理对象中设置像素,我是否需要保留一个作为位图的 DWORD 数组,然后将纹理分配给每一帧?

最后,虽然我最初假设我将在 CPU 上执行此操作,但每像素颜色计算可能也可以在 GPU 上完成。HLSL 代码是设置纹理中单个像素的颜色,还是像素着色器仅用于修改显示像素?

谢谢。

Ofe*_*lon 5

首先,你的直接问题:

从技术上讲,您可以在纹理中设置像素。这将需要使用LockRectUnlockRect API。

在 D3D 上下文中,“锁定”通常是指将资源从 GPU 内存转移到系统内存(从而禁止其参与渲染操作)。锁定后,您可以根据需要修改填充的缓冲区,然后解锁 - 即,将修改后的数据传输回 GPU。通常锁定被认为是一项非常昂贵的操作,但由于PCIe 2.0,这可能不再是主要问题。您还可以指定一个小的(甚至 1 像素)RECT 作为 LockRect 的第二个参数,从而需要对可忽略的数据量进行内存传输,并希望驱动程序确实足够聪明来传输(我知道一个事实在较旧的 nVidia 驱动程序中,情况并非如此)。

实现这一目标的更有效(和代码密集型)方式确实是永远不要离开 GPU。如果将纹理创建为 RenderTarget(即指定 D3DUSAGE_RENDERTARGET 作为其使用参数),则可以在进行任何绘制调用之前将其设置为管道的目标,并编写着色器(可能传递参数)来绘制像素. 渲染目标的这种使用被认为是标准的,您应该能够找到许多代码示例 - 但除非您已经面临性能问题,否则我会说这对于单个 2D 广告牌来说是一种矫枉过正。

哈。