Для HLSL шейдер я работаю (на практике) Я пытаюсь выполнить часть кода, если координаты текстуры (на модели) выше половины соответствующего размера (то есть x > width/2
или y > height/2
). Я знаком с C/C++ и знаю основы HLSL (самые основы). Если никакое другое решение не возможно, я задаю размер текстуры вручную с помощью XNA (в котором я использую шейдер, по сути). Есть ли лучшее решение? Я стараюсь оставаться в Shader Model 2.0, если это возможно.Как получить размер текстуры в HLSL?
ответ
По умолчанию координатное пространство текстуры нормализуется до 0..1 поэтому x > width/2
должно быть просто texcoord.x > 0.5
.
Будьте осторожны. 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;
}
, а не положить дэ текс() вызывает внутри, если ().
Я вижу. Не могли бы вы рассказать мне, почему это так? –
Поскольку текстурные блоки работают через соседние пиксели, чтобы правильно вычислить соответствующий размер фильтра/уровень MIP - то есть, они должны оценить УФ дисперсию в оба экране пространстве X и Y (отсюда наличие DDX() и DDY () в HLSL). if() имеют бесконечно большую потенциальную частоту. Если вы ставите tex2D() внутри предложения if(), тогда у вас будут ошибки текстурирования/фильтрации. – bjorke
спасибо. Это должно работать нормально. –