【问题标题】:How to read direct3d texture pixels如何读取 direct3d 纹理像素
【发布时间】:2010-06-09 00:09:36
【问题描述】:

所以我有一个 x8r8g8b8 格式的 IDirect3DSurface9,其中包含后台缓冲区的内容。当我在它上面调用 LockRect 时,我可以访问一个包含 pBits 的结构,一个指向我假设的像素的指针和整数 Pitch(我不清楚它的用途)。

如何读取单个像素?

Visual Studio 2008 C++

【问题讨论】:

    标签: c++ direct3d


    【解决方案1】:

    锁定区域存储在D3DLOCKED_RECT 中。我从未使用过它,但文档说它是“表面的一行中的字节数”。实际上人们通常会称之为“步幅”(一些术语解释了in the MSDN)。

    例如,如果一个像素有 4 个字节(XRGB 的每个分量 8 位),而纹理宽度为 7,则图像通常存储为 8*4 字节而不是 7*4 字节,因为内存可以如果数据是双字对齐的,访问速度会更快。

    因此,为了读取像素 [x, y],您必须阅读

    uint8_t *pixels = rect.pBits;
    uint32_t *mypixel = (uint32_t*)&pixels[rect.Pitch*y + 4*x];
    

    其中 4 是一个像素的大小。在我的示例中,*myPixel 将是像素的内容。

    【讨论】:

    • 并访问像素的组成部分:uint32_t x = mypixel[0]; uint32_t r = mypixel[1]; uint32_t g = mypixel[2]; uint32_t b = mypixel[3];对吗?
    • 我猜 x 组件只是填充,这种特殊格式是垃圾?
    • XRGB 中的 X 仅用于 32 位对齐(更快)。对组件的访问权限是uint8_t *components = (uint8_t*)mypixel;,然后是X = components[0]; R = components[1],依此类推...
    • 这可能是一个新问题,但是 uint8_t, uint32_t 是从哪里来的呢?我尝试使用它们,编译器不知道它们是什么
    • 它们在stdint.h 中定义。我更喜欢它们,因为标准类型(int、long、char)没有固定大小。见linux.die.net/man/3/uint8_t
    【解决方案2】:

    是的,您可以像这样访问像素的各个 RGB 分量。

    不使用像素的第一个字节,但是每个像素使用 4 Bytes 效率更高,这样每个像素在 32Bit 边界上对齐(这也是为什么会有间距)。

    在您的示例中,未使用 x,但请注意还有其他像素格式,例如 ARGB,它将 alpha 值(透明度)存储在第一个字节中。有时颜色也会反转(BGR 而不是 RGB)。如果您不确定哪个字节对应于什么颜色,一个好方法是创建一个完全为红色、绿色或蓝色的纹理,然后检查 4 个字节中的哪一个的值为 255。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多