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

C++ 如何设置Direct3D纹理中单个像素的颜色?,c++,graphics,directx,direct3d,C++,Graphics,Directx,Direct3d,我试图在Direct3D中绘制一个2D图像到屏幕,我假设必须通过将纹理映射到投影到屏幕上的矩形广告牌多边形来完成。(我不感兴趣或者不能使用Direct2D。)我在SDK中找到的所有纹理信息都描述了如何从文件中加载位图并指定一个纹理来使用该位图,但我还没有找到将纹理作为位图逐像素操作的方法 我真正想要的是一个函数,比如 void TextureBitmap::SetBitmapPixel(整数x、整数y、DWORD颜色); 如果无法直接在纹理对象中设置像素,是否需要保留位图的DWORD数组,然

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

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


void TextureBitmap::SetBitmapPixel(整数x、整数y、DWORD颜色);

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

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


谢谢。

首先,您的直接问题:

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

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

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