Проблемы с выборкой текстур в DirectX 9 HLSL - PullRequest
0 голосов
/ 02 февраля 2011

Я делаю приложение, используя управляемый DirectX 2.0 (который, как я полагаю, совпадает с DirectX9), и я новичок в HLSL, поэтому я извиняюсь, если то, что я делаю, идиотично.Я пишу простой пиксельный шейдер, который просто выводит сохраненную текстуру (назначенную как глобальную переменную) на экран, но я обнаруживаю, что вместо этого она передает переданную ему текстуру (я также передаю другую визуализированную текстуру,этот шейдер является тестовым шейдером).

Мой HLSL-код выглядит следующим образом:

texture inputTex;
sampler2D InputSampler = sampler_state
{
    Texture = <inputTex>;
};
texture DepthTexture;
sampler2D DepthSampler = sampler_state
{
    Texture = (DepthTexture);
    MinFilter = Linear;
    MagFilter = Linear;
    MipFilter = Linear;   
    AddressU  = Clamp;
    AddressV  = Clamp;
};
float4 testPass(float2 TextureCoordinate : TEXCOORD0) : COLOR0
{
    float4 new_color = saturate(tex2D(DepthSampler,TextureCoordinate));
    new_color.a=1;
    return new_color;
}
technique DoF
{
    pass Pass0
    {
        PixelShader = compile ps_2_0 testPass();
    }
}

, а мой C #:

postProc.SetValue("DepthTexture", DepthTexture);
postProc.Begin(FX.DoNotSaveState);
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1.0f, 0);
device.BeginScene();
{
    postProc.SetValue("inputTex", RenderTexture);
    postProc.CommitChanges();
    postProc.BeginPass(0);
    sprite.Draw(RenderTexture, new Rectangle(0, 0, WINDOWWIDTH, WINDOWHEIGHT), new Vector3(0, 0, 0), new Vector3(0, 0, 0), Color.Black);
    postProc.EndPass();
    postProc.End();
    sprite.End();
}
device.EndScene();
device.Present();

Вывод - это то, что хранитсяв RenderTexture, в отличие от того, что хранится в DepthTexture, что и должно быть.Я попытался поменять местами RenderTexture с DepthTexture в этой строке:

sprite.Draw(RenderTexture, new Rectangle(0, 0, WINDOWWIDTH, WINDOWHEIGHT), new Vector3(0, 0, 0), new Vector3(0, 0, 0), Color.Black);

, а вывод - DepthTexture, поэтому он явно берет данные оттуда и текстура отформатирована правильно.

Делает кто-нибудьзнаете какие-нибудь хорошие уроки о том, как сообщить HLSL, когда производить выборку из переданной текстуры, а когда производить выборку из извлеченных данных?

1 Ответ

2 голосов
/ 05 февраля 2011

Я думаю, что Sprite игнорирует состояние эффекта - он просто копирует часть текстуры, которую вы указали, в указанное место. Он не запускает текущий шейдер. Похоже, вы просто пытаетесь нарисовать квадратом размера окна с текущим эффектом; вместо использования Sprite вы, вероятно, просто хотите использовать Device.DrawPrimitives напрямую.

...