SDL_SetRenderTarget не устанавливает tartget - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь написать C ++ лямбда, которая зарегистрирована и будет использоваться в Lua с использованием привязки Sol2.Обратный вызов ниже должен создать текстуру SDL_Texture и очистить ее до цвета.Lua_Texture - это просто оболочка для SDL_Texture, а l_txt.texture имеет тип SDL_Texture *.

lua.set_function("init_texture",
    [render](Lua_Texture &l_txt, int w, int h)
    {
        // free any previous texture
        l_txt.deleteTexture();

        l_txt.texture = SDL_CreateTexture(render, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, w, h);

        SDL_SetRenderTarget(render, l_txt.texture);
        SDL_Texture *target = SDL_GetRenderTarget(render);

        assert(l_txt.texture == target);
        assert(target == nullptr);

        SDL_SetRenderDrawColor(render, 0xFF, 0x22, 0x22, 0xFF);
        SDL_RenderClear(render);
    });

Моя проблема в том, что SDL_SetRenderTarget не работает так, как я ожидал.Я пытаюсь установить текстуру как цель, чтобы я мог очистить ее цвет, но когда я пытаюсь нарисовать текстуру на экране, она все еще пуста.Утверждения в вышеприведенном коде как неудачные, так и показывают, что текущая целевая текстура не настроена на текстуру, которую я пытаюсь очистить и позже использовать, и не является нулевой (что является ожидаемым значением, если нет текущей целевой текстуры).

Я использовал этот фрагмент кода ранее только на c ++ (не как обратный вызов Lua), и он работает как задумано.Каким-то образом встраивание его в Lua приводит к изменению поведения.Любая помощь очень ценится, так как я какое-то время тянул за это волосы, спасибо!

1 Ответ

0 голосов
/ 07 июня 2019

У меня может быть ответ для вас, но он вам не понравится.

Похоже, SDL_GetRenderTarget не работает должным образом.

Я получил точноета же проблема, что и у вас (вот как я нашел ваш вопрос), и я мог бы надежно воспроизвести его с помощью этой простой программы:

int rendererIndex;

[snipped code : rendererIndex is set to the index of the DX11 renderer]

SDL_Renderer * renderer = SDL_CreateRenderer(pWindow->pWindow, rendererIndex, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE);

SDL_Texture* rtTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 200, 200);

SDL_SetRenderTarget(renderer, rtTexture);

if(SDL_GetRenderTarget(renderer) != rtTexture)
  printf("ERROR.");

Это всегда приводит к:

ОШИБКА.

Обходной путь, который я использовал, это сохранение указателя на целевую текстуру рендеринга, который я устанавливаю для средства визуализации и не использую SDL_GetRenderTarget.

РЕДАКТИРОВАТЬ:

Мне было любопытно, почему я не получил правильную цель рендеринга при получении, и я просматриваю исходный код SDL2.Я выяснил, почему (код для ясности):

int
SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
{

// CODE SNIPPED

    /* texture == NULL is valid and means reset the target to the window */
    if (texture) {
        CHECK_TEXTURE_MAGIC(texture, -1);
        if (renderer != texture->renderer) {
            return SDL_SetError("Texture was not created with this renderer");
        }
        if (texture->access != SDL_TEXTUREACCESS_TARGET) {
            return SDL_SetError("Texture not created with SDL_TEXTUREACCESS_TARGET");
        }
// *** EMPHASIS MINE : This is the problem.
        if (texture->native) {
            /* Always render to the native texture */
            texture = texture->native;
        }
    }

// CODE SNIPPED

    renderer->target = texture;

// CODE SNIPPED
}

SDL_Texture *
SDL_GetRenderTarget(SDL_Renderer *renderer)
{
    return renderer->target;
}

Короче говоря, рендерер сохраняет текущую цель рендеринга в renderer->target, но не перед преобразованием текущей текстуры в ее собственную форму.Когда мы используем SDL_GetRenderTarget, мы получаем ту нативную текстуру, которая может отличаться или не отличаться.

...