2013-11-11 3 views
1

Для HLSL шейдер я работаю (на практике) Я пытаюсь выполнить часть кода, если координаты текстуры (на модели) выше половины соответствующего размера (то есть x > width/2 или y > height/2). Я знаком с C/C++ и знаю основы HLSL (самые основы). Если никакое другое решение не возможно, я задаю размер текстуры вручную с помощью XNA (в котором я использую шейдер, по сути). Есть ли лучшее решение? Я стараюсь оставаться в Shader Model 2.0, если это возможно.Как получить размер текстуры в HLSL?

ответ

2

По умолчанию координатное пространство текстуры нормализуется до 0..1 поэтому x > width/2 должно быть просто texcoord.x > 0.5.

+0

спасибо. Это должно работать нормально. –

1

Будьте осторожны. tex2d() и другие вызовы текстуры должны NOT быть в пределах if()/else. Так что если у вас есть пиксельные шейдеры вход «IN.UV» и ваши прицеливания на «OUT.color,» Вы должны сделать это так:

float4 aboveCol = tex2d(mySampler,some_texcoords); 
float4 belowCol = tex2d(mySampler,some_other_texcoords); 
if (UV.x >= 0.5) { 
    OUT.color = /* some function of... */ aboveCol; 
} else { 
    OUT.color = /* some function of... */ belowCol; 
} 

, а не положить дэ текс() вызывает внутри, если ().

+0

Я вижу. Не могли бы вы рассказать мне, почему это так? –

+0

Поскольку текстурные блоки работают через соседние пиксели, чтобы правильно вычислить соответствующий размер фильтра/уровень MIP - то есть, они должны оценить УФ дисперсию в оба экране пространстве X и Y (отсюда наличие DDX() и DDY () в HLSL). if() имеют бесконечно большую потенциальную частоту. Если вы ставите tex2D() внутри предложения if(), тогда у вас будут ошибки текстурирования/фильтрации. – bjorke

 Смежные вопросы

  • Нет связанных вопросов^_^