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

我真正想要的是这样的功能

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

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

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

谢谢。

有帮助吗?

解决方案

首先,你的直接问题:

从技术上讲,您可以在纹理中设置像素。这需要使用 锁定矩形解锁矩形 API。

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

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

HTH。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top