2009-05-04 96 views
4

我试图在Direct3D中绘制2D图像到屏幕上,我假设必须通过将贴图映射到投影填满屏幕的矩形广告牌多边形来完成。 (我不感兴趣或不能使用Direct2D。)我在SDK中找到的所有纹理信息都描述了从文件加载位图并指定纹理以使用该位图,但我尚未找到操作方法纹理作为逐个像素的位图。如何设置Direct3D纹理中单个像素的颜色?

我真正喜欢的是作为

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

这样的功能,如果我不能在纹理对象直接设置像素,我需要保持周围一个DWORD数组,它是在位图,然后将纹理分配给每一帧?

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

谢谢。

回答

4

首先,你直接问:

你可以从技术上讲,在纹理像素集。这将需要使用LockRectUnlockRect API。

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

实现这种效率的更高效(和代码密集型)方法确实永远不会离开GPU。如果您将create your texture作为RenderTarget(即将D3DU​​SAGE_RENDERTARGET指定为其参数usage),则可以在执行绘制调用之前将其设置为管道的目标,然后编写着色器(可能为passing parameters)来绘制像素。渲染目标的这种用法被认为是标准的,你应该能够找到许多代码示例 - 但除非你已经面临性能问题,否则我认为这对于单个2D广告牌来说是一种矫枉过正。

HTH。