【问题标题】:Determine correct pixel format for SDL_CreateTexture()?确定 SDL_CreateTexture() 的正确像素格式?
【发布时间】:2019-05-15 07:41:20
【问题描述】:

我正在努力将一个简单的乒乓球游戏从 SDL 转换为 SDL2,因为我在调用 @987654322 时找不到像素格式参数的有效值(第二个参数'Uint32 格式') @。最后我通过使用SDL_PIXELFORMAT_ARGB8888 找到了成功,我还发现SDL_PIXELFORMAT_UNKNOWN 也可以。但是,在阅读了几篇关于系统字节序和确定字节顺序的文章后,我仍然不确定如何在不猜测、使用未知或运行一些单独的 shell 脚本的情况下为给定系统找到有效的像素格式。

只依赖SDL_PIXELFORMAT_UNKNOWN 是否安全?谁能提供一些信息(或链接)来帮助我更好地理解这些概念并实施它们?我想更好地理解相关概念,以供将来的图形编程使用。

这是代码最初的样子:

screen = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, 
                                        SDL_PIXELTYPE_RGBA32); 

screen_texture = SDL_CreateTextureFromSurface(renderer, screen);

以及我用来使它工作的方法:

screen = SDL_CreateRGBSurface(0, 640, 480, 32,
                              0x00FF0000,
                              0x0000FF00,
                              0x000000FF,
                              0xFF000000);

screen_texture = SDL_CreateTexture(renderer,
                                   SDL_PIXELFORMAT_ARGB8888, 
                                   SDL_TEXTUREACCESS_TARGET,
                                   640, 480); // SDL_PIXELFORMAT_UNKNOWN also works

【问题讨论】:

    标签: c sdl sdl-2


    【解决方案1】:

    给定的SDL_Renderer 将至少支持一个SDL_PixelFormatEnum;其他格式也可以使用,但可能会在创建和/或使用时产生转换损失。

    使用SDL_GetRendererInfo() 填充SDL_RendererInfo 并使用SDL_RendererInfo::texture_formats 中的一种格式(来自here):

    SDL_RendererInfo info;
    SDL_GetRendererInfo( renderer, &info );
    cout << "Renderer name: " << info.name << endl;
    cout << "Texture formats: " << endl;
    for( Uint32 i = 0; i < info.num_texture_formats; i++ )
    {
        cout << SDL_GetPixelFormatName( info.texture_formats[i] ) << endl;
    }
    

    当我运行 DirectX 和 OpenGL 后端都支持 SDL_PIXELFORMAT_ARGB8888 时返回。

    通过git grep -A 25 SDL_RenderDriver 双重检查SDL 代码我认为第一个texture_formats 是“首选”格式:

    SDL_render_d3d.c:SDL_RenderDriver D3D_RenderDriver = {
    SDL_render_d3d.c-    D3D_CreateRenderer,
    SDL_render_d3d.c-    {
    SDL_render_d3d.c-     "direct3d",
    SDL_render_d3d.c-     (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),
    SDL_render_d3d.c-     1,
    SDL_render_d3d.c-     {SDL_PIXELFORMAT_ARGB8888},
    SDL_render_d3d.c-     0,
    SDL_render_d3d.c-     0}
    --
    SDL_render_d3d11.c:SDL_RenderDriver D3D11_RenderDriver = {
    SDL_render_d3d11.c-    D3D11_CreateRenderer,
    SDL_render_d3d11.c-    {
    SDL_render_d3d11.c-        "direct3d11",
    SDL_render_d3d11.c-        (
    SDL_render_d3d11.c-            SDL_RENDERER_ACCELERATED |
    SDL_render_d3d11.c-            SDL_RENDERER_PRESENTVSYNC |
    SDL_render_d3d11.c-            SDL_RENDERER_TARGETTEXTURE
    SDL_render_d3d11.c-        ),                          /* flags.  see SDL_RendererFlags */
    SDL_render_d3d11.c-        6,                          /* num_texture_formats */
    SDL_render_d3d11.c-        {                           /* texture_formats */
    SDL_render_d3d11.c-            SDL_PIXELFORMAT_ARGB8888,
    SDL_render_d3d11.c-            SDL_PIXELFORMAT_RGB888,
    SDL_render_d3d11.c-            SDL_PIXELFORMAT_YV12,
    SDL_render_d3d11.c-            SDL_PIXELFORMAT_IYUV,
    SDL_render_d3d11.c-            SDL_PIXELFORMAT_NV12,
    SDL_render_d3d11.c-            SDL_PIXELFORMAT_NV21
    SDL_render_d3d11.c-        },
    SDL_render_d3d11.c-        0,                          /* max_texture_width: will be filled in later */
    SDL_render_d3d11.c-        0                           /* max_texture_height: will be filled in later */
    SDL_render_d3d11.c-    }
    SDL_render_d3d11.c-};
    --
    SDL_render_metal.m:SDL_RenderDriver METAL_RenderDriver = {
    SDL_render_metal.m-    METAL_CreateRenderer,
    SDL_render_metal.m-    {
    SDL_render_metal.m-        "metal",
    SDL_render_metal.m-        (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),
    SDL_render_metal.m-        6,
    SDL_render_metal.m-        {
    SDL_render_metal.m-            SDL_PIXELFORMAT_ARGB8888,
    SDL_render_metal.m-            SDL_PIXELFORMAT_ABGR8888,
    SDL_render_metal.m-            SDL_PIXELFORMAT_YV12,
    SDL_render_metal.m-            SDL_PIXELFORMAT_IYUV,
    SDL_render_metal.m-            SDL_PIXELFORMAT_NV12,
    SDL_render_metal.m-            SDL_PIXELFORMAT_NV21
    SDL_render_metal.m-        },
    SDL_render_metal.m-    0, 0,
    SDL_render_metal.m-    }
    SDL_render_metal.m-};
    --
    SDL_render_gl.c:SDL_RenderDriver GL_RenderDriver = {
    SDL_render_gl.c-    GL_CreateRenderer,
    SDL_render_gl.c-    {
    SDL_render_gl.c-     "opengl",
    SDL_render_gl.c-     (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),
    SDL_render_gl.c-     1,
    SDL_render_gl.c-     {SDL_PIXELFORMAT_ARGB8888},
    SDL_render_gl.c-     0,
    SDL_render_gl.c-     0}
    SDL_render_gl.c-};
    --
    SDL_render_gles.c:SDL_RenderDriver GLES_RenderDriver = {
    SDL_render_gles.c-    GLES_CreateRenderer,
    SDL_render_gles.c-    {
    SDL_render_gles.c-     "opengles",
    SDL_render_gles.c-     (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC),
    SDL_render_gles.c-     1,
    SDL_render_gles.c-     {SDL_PIXELFORMAT_ABGR8888},
    SDL_render_gles.c-     0,
    SDL_render_gles.c-     0
    SDL_render_gles.c-    }
    SDL_render_gles.c-};
    --
    SDL_render_gles2.c:SDL_RenderDriver GLES2_RenderDriver = {
    SDL_render_gles2.c-    GLES2_CreateRenderer,
    SDL_render_gles2.c-    {
    SDL_render_gles2.c-        "opengles2",
    SDL_render_gles2.c-        (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),
    SDL_render_gles2.c-        4,
    SDL_render_gles2.c-        {
    SDL_render_gles2.c-        SDL_PIXELFORMAT_ARGB8888,
    SDL_render_gles2.c-        SDL_PIXELFORMAT_ABGR8888,
    SDL_render_gles2.c-        SDL_PIXELFORMAT_RGB888,
    SDL_render_gles2.c-        SDL_PIXELFORMAT_BGR888
    SDL_render_gles2.c-        },
    SDL_render_gles2.c-        0,
    SDL_render_gles2.c-        0
    SDL_render_gles2.c-    }
    SDL_render_gles2.c-};
    --
    SDL_render_psp.c:SDL_RenderDriver PSP_RenderDriver = {
    SDL_render_psp.c-    .CreateRenderer = PSP_CreateRenderer,
    SDL_render_psp.c-    .info = {
    SDL_render_psp.c-        .name = "PSP",
    SDL_render_psp.c-        .flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE,
    SDL_render_psp.c-        .num_texture_formats = 4,
    SDL_render_psp.c-        .texture_formats = { [0] = SDL_PIXELFORMAT_BGR565,
    SDL_render_psp.c-                                                 [1] = SDL_PIXELFORMAT_ABGR1555,
    SDL_render_psp.c-                                                 [2] = SDL_PIXELFORMAT_ABGR4444,
    SDL_render_psp.c-                                                 [3] = SDL_PIXELFORMAT_ABGR8888,
    SDL_render_psp.c-        },
    SDL_render_psp.c-        .max_texture_width = 512,
    SDL_render_psp.c-        .max_texture_height = 512,
    SDL_render_psp.c-     }
    SDL_render_psp.c-};
    --
    SDL_render_sw.c:SDL_RenderDriver SW_RenderDriver = {
    SDL_render_sw.c-    SW_CreateRenderer,
    SDL_render_sw.c-    {
    SDL_render_sw.c-     "software",
    SDL_render_sw.c-     SDL_RENDERER_SOFTWARE | SDL_RENDERER_TARGETTEXTURE,
    SDL_render_sw.c-     8,
    SDL_render_sw.c-     {
    SDL_render_sw.c-      SDL_PIXELFORMAT_ARGB8888,
    SDL_render_sw.c-      SDL_PIXELFORMAT_ABGR8888,
    SDL_render_sw.c-      SDL_PIXELFORMAT_RGBA8888,
    SDL_render_sw.c-      SDL_PIXELFORMAT_BGRA8888,
    SDL_render_sw.c-      SDL_PIXELFORMAT_RGB888,
    SDL_render_sw.c-      SDL_PIXELFORMAT_BGR888,
    SDL_render_sw.c-      SDL_PIXELFORMAT_RGB565,
    SDL_render_sw.c-      SDL_PIXELFORMAT_RGB555
    SDL_render_sw.c-     },
    SDL_render_sw.c-     0,
    SDL_render_sw.c-     0}
    SDL_render_sw.c-};
    --
    SDL_DirectFB_render.c:SDL_RenderDriver DirectFB_RenderDriver = {
    SDL_DirectFB_render.c-    DirectFB_CreateRenderer,
    SDL_DirectFB_render.c-    {
    SDL_DirectFB_render.c-     "directfb",
    SDL_DirectFB_render.c-     (SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED),
    SDL_DirectFB_render.c-     /* (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
    SDL_DirectFB_render.c-      SDL_TEXTUREMODULATE_ALPHA),
    SDL_DirectFB_render.c-      (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | SDL_BLENDMODE_BLEND |
    SDL_DirectFB_render.c-      SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD),
    SDL_DirectFB_render.c-     (SDL_SCALEMODE_NONE | SDL_SCALEMODE_FAST |
    SDL_DirectFB_render.c-      SDL_SCALEMODE_SLOW | SDL_SCALEMODE_BEST), */
    SDL_DirectFB_render.c-     0,
    SDL_DirectFB_render.c-     {
    SDL_DirectFB_render.c-             /* formats filled in later */
    SDL_DirectFB_render.c-     },
    SDL_DirectFB_render.c-     0,
    SDL_DirectFB_render.c-     0}
    SDL_DirectFB_render.c-};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      相关资源
      最近更新 更多