OpenGL в DirectX (буфер для текстуры на экран)

0

Я хочу создать текстуру с указателем на буфер пикселей с форматом BGRA и постоянно изменять/обновлять его значения. Я хочу нарисовать эту текстуру на экране в верхнем левом углу каждого кадра.

Используя некоторые из моих знаний XNA и OpenGL, я понял некоторые из них, но я застрял в получении текстуры, чтобы увидеть изменения в буфере. Я также не знаю, как правильно нарисовать текстуру, поэтому я создал спрайт (как и в XNA).

Я написал следующее.

DirectX 9:

void CreateSprite(IDirect3DDevice9* Device, ID3DXSprite* &Sprite)
{
    D3DXCreateSprite(Device, Sprite);
}

void DrawSprite(IDirect3DTexture9* Texture, ID3DXSprite* Sprite, D3DXVECTOR3 Position)
{
    Sprite->Begin(D3DXSPRITE_ALPHABLEND);
        sprite->Draw(Texture, nullptr, nullptr, &Position, 0xFFFFFFFF);
    Sprite->End();
    //SafeRelease(Sprite);
    //SafeRelease(Texture);
}

void BufferToTexture(IDirect3DDevice9* Device, BufferInfo* BuffPtr)
{
    if (BuffPtr != nullptr)
    {
        if (Texture == nullptr)
        {
            Device->CreateTexture(BuffPtr->width, BuffPtr->height, 1, 0, D3DFMT_X8B8G8R8, D3DPOOL_MANAGED, &Texture, 0);
        }
        else
        {
            D3DLOCKED_RECT rect;
            Texture->LockRect(&rect, 0, D3DLOCK_DISCARD);
            std::uint8_t* dest = static_cast<std::uint8_t*>(rect.pBits);
            memcpy(dest, BuffPtr->Pixels, BuffPtr->width * BuffPtr->height * 4);
            Texture->UnlockRect(0);
        }

        //I modify the Pixel Buffer. Not sure if the Texture will see these changes.
        //Would be better if I can make the texture rect.pBits point to BuffPtr->Pixels.
        //So that I can avoid the above memcpy.
        std::uint8_t* Ptr = (std::uint8_t*)BuffPtr->Pixels;
        for (int I = 0; I < BuffPtr->height; ++I)
        {
            for (int J = 0; J < BuffPtr->width; ++J)
            {
                std::uint8_t B = *(Ptr++);
                std::uint8_t G = *(Ptr++);
                std::uint8_t R = *(Ptr++);
                *(Ptr++) = (B == 0 && G == 0 && R == 0) ? 0 : 0xFF;
            }
        }
    }
}

В OpenGL код напрямую использует буфер пикселов. Любые изменения в буфере также происходят с текстурой, и копирование не выполняется. Код позволяет мне нарисовать массив пикселей непосредственно на экране. Я пытаюсь сделать то же самое в DirectX, но я не уверен, как сделать текстуру увидеть изменения в буфере. Кроме того, я не уверен, как нарисовать текстуру DirectX на экране.

Теги:
opengl
directx-9

1 ответ

1
Лучший ответ

"Не уверен, увидит ли текстура эти изменения".

Нет, это не произойдет, потому что вы делаете изменения в памяти после того, как вы Unlock прямоугольник. Блокировка и разблокировка ресурса в D3D аналогична распаковке объекта-буфера в OpenGL.

Что касается того, почему он работает в OpenGL, я могу только представить, что вы собираете и отформатируете свой PBO где-то вне функции BufferToTexture (...). Если вы измените свой код D3D, чтобы работать таким образом, вы должны быть частью этого решения.

Вы также должны знать, что D3D использует другое происхождение текстуры: (0,0) является верхним левым в D3D и внизу слева в OpenGL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню