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

5

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

我真正想要的是这样一个函数

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

如果不能直接设置纹理对象中的像素,则需要保存DWORD数组作为位图,并在每帧分配纹理吗?

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

谢谢。

1个回答

5

首先,是您的直接问题:

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

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

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

希望能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接