Нужен простой код пиксельного шейдера, который просто рисует текстуру ввода на экране (область просмотра) - PullRequest
1 голос
/ 13 ноября 2010

Мне нужен простой код шейдера для использования с моим приложением XNA, которое просто рисует заданную текстуру на экране. По сути, я пытаюсь выполнить постобработку, но моя цель здесь - не применять какой-либо эффект постобработки, но просто отобразить текстуру как саму по себе ..

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

sampler textureSampler;

float4 PostProcessingPS(float2 texCoord: TEXCOORD0, float4 Position : POSITION0) : COLOR0
{
    float4 color = tex2D(textureSampler,texCoord);
    return color;
}

technique PostProcessingEffect
{
    pass Pass1
    {
        PixelShader = compile ps_2_0 PostProcessingPS();
    }
}

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

Вот как это должно быть: alt text

И вот что я вижу: alt text

Есть идеи?

Ответы [ 2 ]

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

Как вы рисуете полноэкранный квад? У вас может быть обмотка вершины, противоположная текущему режиму отбраковки, поэтому треугольники отбракованы на обратной стороне. Вы можете проверить это с помощью GraphicsDevice.RenderState.CullMode = CullMode.None в XNA 3.x или GraphicsDevice.RasterizerState = RasterizerState.CullNone в 4.0.

Диагональная линия, которую вы видите внизу по центру экрана, заключается в том, что вам не хватает полупиксельного смещения для правильного выравнивания текселей по пикселям на экране. Попробуйте добавить смещение к вашим позициям вершин, когда вы передаете их из вершинного шейдера в пиксельный шейдер следующим образом:

Position.x - = 1.0 / ViewportSize.x;

Position.y + = 1.0 / ViewportSize.y;

Где ViewportSize содержит размеры вашего окна просмотра в пикселях (например, 1024 768).

0 голосов
/ 14 февраля 2011

Мой лучший совет - просто отобразить текстуру в вашем коде рисования.Почему вы не можете сделать это в приложении, а не в пиксельном шейдере?

Если вы действительно хотите сделать пиксельный шейдер, вам нужно будет дать больше кода.То, что рисуется, зависит от координат текстуры, поэтому мне нужно будет увидеть ваш код рисования, чтобы ответить на этот вопрос.

...