|
Xors3D Графический движок с поддержкой DirectX9 |
21.10.2011, 21:23
|
#1
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Нубошоу по шейдерам.
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), что вызовет ошибку компиляции шейдера.
|
следует, что такая структура допустима.
Где я не прав? Мне почему-то кажется, что стандартный шейдер из шагов с таким изменением вывода вершинного шейдера должен работать. Или шаги уже устарели?
|
(Offline)
|
|
21.10.2011, 21:41
|
#2
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Нубошоу по шейдерам.
шейдер перестает исполнятся
|
компилятор должен написать причину ошибки.
в том числе вроде как компиляция фейлится если ты не до конца заполнил выходящую структуру.
т.е. просто добавил в структуру поле, но не закидал в него данные в VS.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.10.2011, 22:01
|
#3
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Нубошоу по шейдерам.
float2?
|
(Offline)
|
|
21.10.2011, 22:01
|
#4
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Нубошоу по шейдерам.
Извольте включить логгирование, сударь: xCreateLog(). В созданном html-файле Вы обнаружите крайне полезную для Вас информацию.
__________________
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
|
|
21.10.2011, 22:10
|
#5
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Нубошоу по шейдерам.
Да. Круто. Спасибо.
|
(Offline)
|
|
22.10.2011, 23:43
|
#6
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Нубошоу по шейдерам.
Подобные косяки с освещением лечатся попиксельным освещением(как-нибудь еще но тоже шейдером) или нужно ковырять модель?
float4 ambient : COLOR_AMBIENT;
...
float4 color=saturate(diffuse * lit * lightColor+diffuse*ambient);
...
Ambientcolor надо так учитывать или по другому?
|
(Offline)
|
|
23.10.2011, 00:05
|
#7
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Нубошоу по шейдерам.
Подобные косяки с освещением лечатся попиксельным освещением(как-нибудь еще но тоже шейдером) или нужно ковырять модель?
|
проверь попиксельное - делов то. если не пофиксится, то хз.
Ambientcolor надо так учитывать или по другому?
|
так у тебя пересветится всё может.
мне больше нравится такой вариант:
lit = saturate(dot(normal,lightDir));
float4 color = diffuse * lerp(ambientColor,lightColor,lit) * 2;
"*2" позволяет делать цвета диффуза ярче оригинала. собстсвенно, формула diff*lit*2, это бленд Multiply2, который есть в блице например, и юзается во всех играх для лайтмапов.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.10.2011, 00:13
|
#8
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Нубошоу по шейдерам.
На уровне модели это вылечить можно запретив нормалям вершин на углах клеток одновременно наклоняться к диагонали. Но это сортировать и сравнивать надо командой наподобие dot
lit = saturate(dot(normal,lightDir);
|
На мой взгляд тут saturate как козе баян, косинус не будет больше 1, а эта команда если я не ошибаюсь возвращает косинус угла между векторами, но может я и гоню. Наврал. Там еще на длины векторов умножается.
|
(Offline)
|
|
23.10.2011, 00:21
|
#9
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Нубошоу по шейдерам.
На мой взгляд тут saturate как козе баян
|
в lerp будет разница
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.10.2011, 01:42
|
#10
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Нубошоу по шейдерам.
Сообщение от dsd
На мой взгляд тут saturate как козе баян, косинус не будет больше 1
|
Сударь, Вы не учли тот случай, при котором косинус меньше ноля.
__________________
|
(Offline)
|
|
23.10.2011, 14:51
|
#11
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений (для 6,853 пользователей)
|
Ответ: Нубошоу по шейдерам.
Оу, какая познавательная тема!
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Online)
|
|
25.10.2011, 20:20
|
#12
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Нубошоу по шейдерам.
У меня глупый вопрос: как я могу создать текстуру шейдером? В том смысле, что создать шейдер, который будет рисовать в текстуру. Пытался гуглить, но не смог.
|
(Offline)
|
|
25.10.2011, 21:37
|
#13
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Нубошоу по шейдерам.
в ксорсе вроде как создаёшь текстуру, делаешь xSetBuffer(xTextureBuffer(texture)), и будет рисоваться в неё.
|
(Offline)
|
|
25.10.2011, 21:50
|
#14
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Нубошоу по шейдерам.
писать напрямую в текстуру из шейдера можно только на SM 5.0.
однако никто не мешает задать текстуру как рендертаргет и рисовать в нее фуллтекссайзквад. с нужным шейдером.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
26.10.2011, 13:26
|
#15
|
ПроЭктировщик
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений (для 25 пользователей)
|
Ответ: Нубошоу по шейдерам.
Сообщение от HolyDel
писать напрямую в текстуру из шейдера можно только на SM 5.0.
однако никто не мешает задать текстуру как рендертаргет и рисовать в нее фуллтекссайзквад. с нужным шейдером.
|
Ото матерится по учёному)
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:08.
|