ПрограммированиеФорумГрафика

Заливка в полоску HLSL (2 стр)

Страницы: 1 2
#15
22:33, 12 сен 2015

Suslik
У меня все заливается одним цветом всегда - это мало информации дает((
Цифровые никак нельзя получать оттуда значения?

#16
22:38, 12 сен 2015

helldrg
> У меня все заливается одним цветом всегда - это мало информации дает((
прояви смекалку. если значение слишком большое, помножь его на 1e-6f. если станет чёрным, то на 1e-3f. ищи, какое там именно значение и откуда оно берётся. как ты себе представляешь вывод цифрового значения, если для каждого пикселя оно своё? отладчики шейдеров существуют, но это баловство, всю жизнь цветом отладочную информацию кодировали.

#17
22:45, 12 сен 2015

Suslik
Вроде бы потихоньку стал разбираться, спасибо!

#18
22:52, 12 сен 2015

Господин Suslik можно ли вас так называть?)
Я одного не могу понять, почему так работает:

if(input.position.y % 2 > 1)
  color = float4(0.0f, 1.0f, 1.0f, 1.0f);
  else
  color = float4(1.0f, 1.0f, 1.0f, 1.0f);
  
  return color;

А так нет:

if(input.position.y % 2 == 1)
  color = float4(0.0f, 1.0f, 1.0f, 1.0f);
  else
  color = float4(1.0f, 1.0f, 1.0f, 1.0f);
  
  return color;
#19
22:57, 12 сен 2015

и input.position имеет экранные координаты т.е. если картинка находится на экране в позиции 300 по оси y, то первый пиксель в шейдере находится на 300 позиции, не подскажете как перевести в 0 ил 1 позицию

#20
23:07, 12 сен 2015

Может быть кому то еще пригодится шейдер заполняющий объект в полоску:

float4 TexturePixelShader(PixelInputType input) : SV_TARGET
{
  float4 color;
  float size = 50;
  if(input.position.y % (1*size) > (1*size)/2)
    color = float4(0.0f, 1.0f, 1.0f, 1.0f);
  else
    color = float4(1.0f, 1.0f, 1.0f, 1.0f);
  
  return color;
}
#21
0:54, 13 сен 2015

helldrg
> А так нет:
наверное, потому что в hlsl операция деления с плавающей точкой возвращает float-число [0..2], которое никогда(почти) не будет строго равно 1?

если погуглить, то можно действительно узнать, что в hlsl аналог fmod — это просто %. но не совсем:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb509631(v=vs.85).aspx#Additive_and_Multiplicative_Operators
The % operator is defined only in cases where either both sides are positive or both sides are negative
так что для отрицательных координат может не работать.

> Господин Suslik можно ли вас так называть?)
наркоманы, блин

#22
1:26, 13 сен 2015

Suslik

наркоманы, блин

((((
Осталось только одно прояснить

и input.position имеет экранные координаты т.е. если картинка находится на экране в позиции 300 по оси y, то первый пиксель в шейдере находится на 300 позиции, не подскажете как перевести в 0 ил 1 позицию

что бы input.position.y = 1 было позицией не начала экрана, а начала объекта

#23
1:35, 13 сен 2015

helldrg
> Я одного не могу понять, почему так работает:
> А так нет:
Потому что нельзя быть на свете красивой такой так сравнивать флоаты

#24
1:39, 13 сен 2015

Misanthrope
Действительно, спасибо

#25
1:44, 13 сен 2015

helldrg
> что бы input.position.y = 1 было позицией не начала экрана, а начала объекта

float stripPosition = inputPosition.y - objectPosition.y;
return stripPosition % stripWidth > stripWidth * 0.5f ? color1 : color2;
#26
2:18, 13 сен 2015

Suslik
Я добавил в структуру еще одни координаты

struct PixelInputType
{
  float4 positionGlobal : SV_POSITION;
  float4 positionObject : POSITION; //в вершинном шейдере присваиваю значение input.position
};

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

if(input.positionObject.y > -200); //а не так if(input.positionObject.y > 200).

Не подскажете как исправить

#27
2:28, 13 сен 2015

helldrg
> Не подскажете как исправить
нет. отлаживай.

#28
4:05, 13 сен 2015

Suslik
Я без понятия как такое отладить. Почему эта линия становится изогнутой после того как нормализую локальные координаты объекта
1212 | Заливка в полоску HLSL

Страницы: 1 2
ПрограммированиеФорумГрафика

Тема в архиве.