Понимание текстурных регистров и сэмплеров с учетом оптимизации - PullRequest
2 голосов
/ 31 марта 2011

У меня есть 3 различных эффекта xna, один из которых называется initialise, один называется iterate, а другой называется finalize.

Initialise не требует ввода текстуры и выполняет рендеринг для 3 целей.Итерация принимает эти 3 в качестве входных данных текстуры и отрисовывает 3 цели, итерация выполняется несколько раз.Finalize принимает 1 текстурный ввод и выполняет рендеринг для одной цели.

У меня есть несколько вспомогательных классов, но должно быть очевидно, что происходит из моего цикла рендеринга ниже:

int i = 0;

FractalInitRenderer.DefineOutputs(IterationsAndControl[i], Variables1And2[i], Variables3And4[i]);
FractalInitRenderer.Draw();

for (; i < 50; i++)
{
    FractalIterateRenderer.ClearInputTextures();
    FractalIterateRenderer.AddInput("IterationsAndControl", IterationsAndControl[i % 2]);
    FractalIterateRenderer.AddInput("Variables1And2", Variables1And2[i % 2]);
    FractalIterateRenderer.AddInput("Variables3And4", Variables3And4[i % 2]);
    FractalIterateRenderer.DefineOutputs(IterationsAndControl[(i + 1) % 2], Variables1And2[(i + 1) % 2], Variables3And4[(i + 1) % 2]);
    FractalIterateRenderer.Draw();
}

FractalFinaliseRenderer.ClearInputTextures();
FractalFinaliseRenderer.AddInput("IterationsAndControl", IterationsAndControl[i % 2]);
FractalFinaliseRenderer.Draw();

Myобъявления текстуры используют следующий макрос и определяются следующим образом, вместе с моей структурой вывода:

#define DECLARE_TEXTURE(Name, index) \
    Texture2D<float4> Name : register(t##index); \
    sampler Name##Sampler : register(s##index);
struct FRACTAL_OUTPUT
{
    float4 IterationsAndControl : COLOR0;
    float4 Variables1And2 : COLOR1;
    float4 Variables3And4 : COLOR2;
};

Что мне интересно, могу ли я поместить цели визуализации ввода и вывода в разные текстурырегистры , затем, возможно, запустить 2 итерационных пиксельных шейдера поочередно, один из них читает из первых 3 регистров, записывает в последние 3, а другой читает из последних 3 и записывает в первые 3?

Я предполагаю, что есть много затрат, связанных с установкой целей рендеринга и входных текстур много раз, что мне больше не нужно было бы делать. Будет ли этого избежать, и будет ли оно того стоить?

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

1 Ответ

0 голосов
/ 31 марта 2011

Как указано в документации :

Во время отрисовки текстуру нельзя одновременно установить в качестве цели рендеринга и текстуру на этапе.

В принципе, концепция того, что вы делаете, прекрасна.Наличие трех входных текстур и трех выходных текстур, а затем их переключение на каждом проходе.Но вы должны явно их поменять.

Хорошая новость заключается в том, что я вполне уверен, что в Windows , изменение текстур и целей рендеринга - относительно недорогая операция.Вы можете связываться с RenderTargetUsage (возможно, установив PreserveContents), чтобы создать только одну поверхность.(Я не совсем уверен, что делает XNA 4.0, потому что поведение было * задокументировано в более ранних версиях и могло измениться ; вы можете попытаться выяснить это с помощью PIX).

Xbox 360, с другой стороны, это другая история .

...