forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Нубошоу по шейдерам. (http://forum.boolean.name/showthread.php?t=15694)

dsd 21.10.2011 21:23

Нубошоу по шейдерам.
 
Код:

struct VSOutput
{
float4 position : POSITION;
float4 position2 : TEXCOORD2;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
};

Вставляю в вывод вершинного шейдера выделенную строку и шейдер перестает исполнятся, хотя из:
Цитата:

В качестве результата своей работы, вершинные шейдер помет возвращать сле-дующие данные:

POSITION0 – трансформированная позиция вершины.

COLOR[n] – значение цвета, стоит отметить, что записывать именно цвет сюда вовсе необязательно, например, в случае если необходимо передать в пиксельный шейдер позицию, ее спокойно можно поместить в любое поле с семантикой COLOR или TEXCOORD.

TEXCOORD[n] – текстурные координаты. Не обязательно float2 зна-чение, может быть любым в зависимости от ваших нужд (например, для передачи нормали можно использовать float3).

FOG – float значения тумана для данной вершины.

PSIZE – размер точки. Действует только на точечные спрайты (системы частиц).
Например, если нам необходимо рассчитать попиксельное
Код:

struct VSOutput
{
float4 position : POSITION;
float4 position2 : TEXCOORD1;
float3 normal : TEXCOORD2;
float2 texCoords0 : TEXCOORD0;
};

Т.к. в качестве входных данных пиксельный шейдер может принимать только цвет и текстурные координаты (т.е. поля можно объявлять только с семантиками COLOR и TEXCOORD), для передачи в пиксельный шейдер позиции вершины и ее нормали необходимо записать их в поля с семантиками текстурных координат.
Однако, вполне допустимо использовать выходную структуру вершинного шей-дера в качестве входной пиксельного, но только до тех пор пока в пиксельном шей-дере не происходит обращения к полям с недопустимой семантикой (например POSITION), что вызовет ошибку компиляции шейдера.
следует, что такая структура допустима.
Где я не прав? Мне почему-то кажется, что стандартный шейдер из шагов с таким изменением вывода вершинного шейдера должен работать. Или шаги уже устарели?

Mr_F_ 21.10.2011 21:41

Ответ: Нубошоу по шейдерам.
 
Цитата:

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

moka 21.10.2011 22:01

Ответ: Нубошоу по шейдерам.
 
float2?

.Squid 21.10.2011 22:01

Ответ: Нубошоу по шейдерам.
 
Извольте включить логгирование, сударь: xCreateLog(). В созданном html-файле Вы обнаружите крайне полезную для Вас информацию.

dsd 21.10.2011 22:10

Ответ: Нубошоу по шейдерам.
 
Да. Круто. Спасибо.

dsd 22.10.2011 23:43

Ответ: Нубошоу по шейдерам.
 

Подобные косяки с освещением лечатся попиксельным освещением(как-нибудь еще но тоже шейдером) или нужно ковырять модель?

Код:

float4 ambient : COLOR_AMBIENT;
...
float4 color=saturate(diffuse * lit * lightColor+diffuse*ambient);
...

Ambientcolor надо так учитывать или по другому?

Mr_F_ 23.10.2011 00:05

Ответ: Нубошоу по шейдерам.
 
Цитата:

Подобные косяки с освещением лечатся попиксельным освещением(как-нибудь еще но тоже шейдером) или нужно ковырять модель?
проверь попиксельное - делов то. если не пофиксится, то хз.
Цитата:

Ambientcolor надо так учитывать или по другому?
так у тебя пересветится всё может.
мне больше нравится такой вариант:
lit = saturate(dot(normal,lightDir));
float4 color = diffuse * lerp(ambientColor,lightColor,lit) * 2;

"*2" позволяет делать цвета диффуза ярче оригинала. собстсвенно, формула diff*lit*2, это бленд Multiply2, который есть в блице например, и юзается во всех играх для лайтмапов.

dsd 23.10.2011 00:13

Ответ: Нубошоу по шейдерам.
 
На уровне модели это вылечить можно запретив нормалям вершин на углах клеток одновременно наклоняться к диагонали. Но это сортировать и сравнивать надо командой наподобие dot

Цитата:

lit = saturate(dot(normal,lightDir);
На мой взгляд тут saturate как козе баян, косинус не будет больше 1, а эта команда если я не ошибаюсь возвращает косинус угла между векторами, но может я и гоню. Наврал. Там еще на длины векторов умножается.

Mr_F_ 23.10.2011 00:21

Ответ: Нубошоу по шейдерам.
 
Цитата:

На мой взгляд тут saturate как козе баян
в lerp будет разница

.Squid 23.10.2011 01:42

Ответ: Нубошоу по шейдерам.
 
Цитата:

Сообщение от dsd (Сообщение 206647)
На мой взгляд тут saturate как козе баян, косинус не будет больше 1

Сударь, Вы не учли тот случай, при котором косинус меньше ноля.

Randomize 23.10.2011 14:51

Ответ: Нубошоу по шейдерам.
 
Оу, какая познавательная тема!

dsd 25.10.2011 20:20

Ответ: Нубошоу по шейдерам.
 
У меня глупый вопрос: как я могу создать текстуру шейдером? В том смысле, что создать шейдер, который будет рисовать в текстуру. Пытался гуглить, но не смог.

Mr_F_ 25.10.2011 21:37

Ответ: Нубошоу по шейдерам.
 
в ксорсе вроде как создаёшь текстуру, делаешь xSetBuffer(xTextureBuffer(texture)), и будет рисоваться в неё.

HolyDel 25.10.2011 21:50

Ответ: Нубошоу по шейдерам.
 
писать напрямую в текстуру из шейдера можно только на SM 5.0.
однако никто не мешает задать текстуру как рендертаргет и рисовать в нее фуллтекссайзквад. с нужным шейдером.

Crayzi 26.10.2011 13:26

Ответ: Нубошоу по шейдерам.
 
Цитата:

Сообщение от HolyDel (Сообщение 206960)
писать напрямую в текстуру из шейдера можно только на SM 5.0.
однако никто не мешает задать текстуру как рендертаргет и рисовать в нее фуллтекссайзквад. с нужным шейдером.

Ото матерится по учёному)


Часовой пояс GMT +4, время: 21:08.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot