Рендеринг двух меньших текстур на большую текстуру

0

Когда я рисую две текстуры на более крупную текстуру.

Рассматривать:

  • ID3D10Texture2D A
    • ID3D10Texture2D B
    • ID3D10Texture2D C

Если я сначала нарисую Texture B, полную ширину Texture A, а затем нарисую Texture C только на половине текстуры A. Почему текстура C стирает область себя из Texture B?

Затем я рисую Texture A на backbuffer, чтобы увидеть результаты.

Изображение 174551

Я провел некоторое дополнительное тестирование и выяснил, что альфа Текстуры C также влияет на альфа Текстуры B, так что если альфа текстуры C слишком низкая, вы не можете увидеть текстуру B. Как можно решить такую проблему? На самом деле, как это может быть проблемой? Потому что я сделал C после B. ##

blendDesc.BlendEnable[0] = TRUE;
blendDesc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;
blendDesc.SrcBlend = D3D10_BLEND_SRC_ALPHA;
blendDesc.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;
blendDesc.BlendOp = D3D10_BLEND_OP_ADD;
blendDesc.SrcBlendAlpha = D3D10_BLEND_ONE;
blendDesc.DestBlendAlpha = D3D10_BLEND_ZERO;
blendDesc.BlendOpAlpha = D3D10_BLEND_OP_ADD;

hr = aDXDevice->CreateBlendState(&blendDesc, &this->g_pBlendState);

Изображение 174551 ПРИМЕЧАНИЕ. Текстура B охватывает всю ширину, но текстура C помещается на полпути поверх текстуры B. Поскольку текстура B является сплошным красным изображением, текстура C + текстуры B не должна быть прозрачной.

  • 0
    Не совсем понятно, о чем вы спрашиваете. Можете ли вы показать код и несколько скриншотов? Вы визуализируете суб-текстуры непосредственно в текстуру А, верно?
  • 0
    @ Нико Шертлер Точно. Да, подтексты ID3D10Texture2D помещены в текстуру A типа ID3D10Texture2D ! Я не хочу помещать код, так как код DX очень очень длинный и требует много файлов для размещения здесь.
Показать ещё 5 комментариев
Теги:
directx

2 ответа

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

Не претендуя на то, чтобы быть ответом, это просто догадка.

Возможной причиной проблемы смешивания является распространение состояний в следующий призыв к обращению.

Все состояния DirectX (а также GL) не сбрасываются в конце кадра, они сохраняются до изменения или сброса контекста.

Итак, возможно, у вас состояние смешивания

hr = aDXDevice->CreateBlendState(&blendDesc, &this->g_pBlendState);

и вы применяете его после рисования B, но перед рисованием C:

DrawB();
aDXDevice->OMSetBlendState(&g_pBlendState, ...);
DrawC();

Первый кадр рисуется, как вы ожидаете, но на следующих кадрах g_pBlendState все еще активен. Таким образом, B рисует без альфа только на первом кадре.

Вам нужно два состояния смешивания, по одному для каждого режима наложения и применение каждого кадра:

aDXDevice->CreateBlendState(&blendDescForB, &blendStateForB); // no alpna
aDXDevice->CreateBlendState(&blendDescForC, &blendStateForC); // alpha enabled

aDXDevice->OMSetBlendState(blendStateForB, ...);
DrawB();
aDXDevice->OMSetBlendState(blendStateForC, ...);
DrawC();

Для быстрой отладки этой проблемы вы можете попробовать применить ID3D10Device :: ClearState после Present(). Но только для отладки.

Обратите внимание, что есть одна точка, противопоставляющая мою гипотезу: смешивание A не касается.

  • 0
    Как можно определить, есть ли у текстуры альфа?
  • 0
    @ mk1 Если я правильно понял, ваш вопрос, это решать художнику, какие объекты прозрачны и как они рисуют. Так что это должно быть известно до того, как сделать рендеринг.
0

Не уверен в точных деталях, но помните, что OpenGL - это трехмерная библиотека, она учитывает глубину, когда дело доходит до определения того, какой объект закрывает другие объекты. OpenGL также использует числа с плавающей запятой для вершин, что означает, что даже если числа выглядят одинаково, многие из них не будут. Единственный безопасный способ гарантировать, что один объект находится напротив другого, - это сделать его так. Для 2D-чертежа в целом лучше всего обеспечить, чтобы ваши объекты не перекрывались вообще.

  • 0
    Несмотря на то, что вопрос касался DirectX, а не OpenGL, я согласился с тем, что может быть проблема с буфером глубины, поэтому большая текстура перекрывается с меньшей. И лучший способ проверить это - нарисовать их таким образом, чтобы меньшая текстура всегда была частично видимой и не покрывалась полностью большей. Нужно сказать, что могут быть и другие проблемы (или комбинации проблем), которые могут привести к такому результату. Они обычно решаются с помощью графической отладки.
  • 0
    @Drop Я считаю, что это проблема смешения, когда альфа TextureC влияет на альфа TextureB

Ещё вопросы

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