使用汇编代码在 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);
为了在 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);