5

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

我真正想要的是一个功能,例如

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

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

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

谢谢。

4

1 回答 1

5

首先,您的直接问题:

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

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

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

HTH。

于 2009-05-04T06:39:21.890 回答