Пример нескольких текстур и рендеринг на несколько текстур в одном пиксельном шейдере - PullRequest
1 голос
/ 30 марта 2011

Моя общая цель - создать пиксельный шейдер, который принимает в качестве входных данных несколько текстур и выполняет рендеринг для нескольких целей. Как и через шейдер инициализации и финализации, через повторные запуски этого шейдера я получу свой результат.

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

Я считаю, что проблемы вызывают мое отсутствие полного понимания семантики и того, как правильно настроить текстуры ввода и вывода.

Я видел несколько разных способов получения входных текстур и запутался в том, как их настроить.

Ниже приведен код разделяемой структуры, которая выводится шейдерами init и itterate (шейдер finalize просто выводит цвет):

struct FRACTAL_OUTPUT
{
    float4 IterationsAndControl : COLOR0;
    float4 Variables1And2 : COLOR1;
    float4 Variables3And4 : COLOR2;
};

Ниже приведены описания текстур для шейдеров itterate и finalize (шейдер init не использует никаких текстур):

Texture2D IterationsAndControl;
sampler IterationsAndControlSampler : register(s4)
{
    Texture = <IterationsAndControl>;
};</p>

<p>Texture2D Variables1And2;
sampler Variables1And2Sampler : register(s5)
{
    Texture = <IterationsAndControl>;
};</p>

<p>Texture2D Variables3And4;
sampler Variables3And4Sampler : register(s6)
{
    Texture = <IterationsAndControl>;
};

В коде c # XNA я установил цели рендеринга (выполнив GraphicsDevice.SetRenderTargets (), затем установил параметры текстуры (выполнив Effect.Parameter ["TextureVariableName"]. SetValue (), затем нарисовал квад (через спрайт). партия).

Любая помощь будет принята с благодарностью, поскольку я не могу найти никаких примеров того, как сделать что-то подобное.

1 Ответ

1 голос
/ 31 марта 2011

Для всех, кому интересно, мне удалось (через много проб и ошибок!) Заставить это работать.

Поскольку я занимаюсь обработкой чисел, я установил формат целей рендеринга на Vector4 (ранее у меня был rgba64, который, похоже, не работал). Поскольку я сейчас использую векторный формат, мне также пришлось изменить сэмплеры устройства на SamplerState.Point:

GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[1] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[2] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[3] = SamplerState.PointClamp;

Моя структура FRACTAL_OUTPUT не изменилась.

Что изменилось, так это сэмплеры. Я использую макрос, определенный в сэмплерах эффекта XNA:

#define DECLARE_TEXTURE(Name, index) \
Texture2D<float4> Name : register(t##index); \
sampler Name##Sampler : register(s##index);

Затем для выборки нескольких текстур я делаю следующее:

DECLARE_TEXTURE(IterationsAndControl, 1);
....
return tex2D(IterationsAndControlSampler, texCoord).x;

Затем в c # я установил цели рендеринга обычным способом, установив свои входные текстуры так же, как и любой другой параметр эффекта.

...