使用汇编代码在 OpenGL 中呈现视频时出错

Error when using Assembly code to render a video in OpenGL

为了在 OpenGL 中渲染视频,我遵循了 Nehe 中的教程。我试图在 x64 上构建它,但它在编译代码时给我一个错误,它指向 flipIt(void* buffer) 函数。是写的不好还是需要导入库?

void Video::flipIt(void* buffer)
{
    void* b = buffer;
    __asm
    {
        mov ecx, 256 * 256
        mov ebx, b
        label :
        mov al, [ebx + 0]
            mov ah, [ebx + 2]
            mov[ebx + 2], al
            mov[ebx + 0], ah

            add ebx, 3
            dec ecx
            jnz label
    }
}

Microsoft Developer Network (MSDN) 有 RGB 的 24 位位图,所以 WINDOWS,RGB 数据实际上是反向存储的 (BGRs),但在 OpenGL 中, RGB 就是 RGB。

Nehe 使用的解决方案是编写汇编代码,在我看来这不是一个好主意,因为 Visual C++ does not support inline assembly for x64,因此您不能使用 ASM 代码交换字节。您现在可以做的是修改纹理生成代码以使用 GL_BGR 而不是 GL_RGB,但要小心,某些 OpenGL 驱动程序在 GL_BGR.

方面存在问题

所以去掉_asm函数,把glTexSubImage2D(...)函数中的GL_RGB改成GL_BGR:

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 256, GL_BGR, GL_UNSIGNED_BYTE, data);