Шейдеры + частицы
Хочу слепить системку частиц с возможностью применения им шейдера - хочухочухочу!!!))) Я нуб, ламерюга и все такое - но желаю просветится и проникнуться знаниями о великих гуру :download:
Изза брака знаний Я столкнулся с такой проблемой: Судари: подскажите, объясните, расскажите - где у нас тут координата w подевалась то, ааа?) не шейдер,ефикс Код:
Handle mesh = xCreateMesh(); Код:
struct vsi вопрос: где же ты, w, кто тебя обидел?!? Стандартное заранее спасибо. За ответ или за найденную w - возможно вознаграждение:-) UPD: как словить в шейдере цвет вертекса заданного через иксВертексКолор? Думал что с помощью COLOR_DIFFUSE но полностью белый квадратик показал мне фак... ЗЫ: Я знаю что уже задал вопрос этот тут и изначальний тут - безрезультатно, поэтому создал тему - более заметная хрень))) Предлагаю модераторам удалить эти два вышеуказанных сообщения С уважением и большой как вселенная надеждой, Аник |
Ответ: Шейдеры + частицы
Цитата:
{ float4 position : POSITION; float3 normal : NORMAL; float4 color : COLOR; float2 texCoords0 : TEXCOORD0; }; Вот там где красненькое цвет вершины автоматически подставится с такой семантикой struct VSOutput { float4 position : POSITION; float3 normal : TEXCOORD1; float2 texCoords : TEXCOORD0; float4 color : TEXCOORD2; }; Дальше вершинный шейдер, который должен развернуть квад лицом к камере. Если output.position = mul(input.position, matrixWorldViewProj); то в выводе лежит позиция центра квада, притом что после этой команды все сместилось относительно камеры, то есть весь мир в её локальных координатах стал, то прибавив вектор смещения от центра этой вершины ты получишь где эта вершина должна быть. для верхнего левого прибавляешь(-1,1,0) для верхнего правого (1,1,0), к нижнему левому (-1,-1,0) к четвертому (1,-1,0). Отличить вершины легко по текстурным координатам и выбрать соответствующее смещение. дальше передаешь цвет в вывод вершинного, который ввод пиксельного output.color = input.color; Потом идет пиксельный шейдер, который рисует на экран float4 PSMain(VSOutput input) : COLOR0 { return input.color; } И типа все должно сработать. Если память мне не изменяет, а она может :) |
Ответ: Шейдеры + частицы
Все заработало как часики швейЦарские) Правда с пропорциями квада чтото не то - какой-то сплющенный он получился Код:
struct vsi И еще вопрос: есть функции для передачи в шейдер инфу всякую, ОК. Беру из документации одну такую, и тут компилятор как заорет! Грит, Я положил свой массив туда где якобы должен быть хэндл. Ну ладно - смотрю входные параметры этой функции а там - И вправду нужен какой-то Handle value! НУ ЛАДНО, думаю мож надо передать каким-то макаром адрес массива в целочисленном виде - фиг тебе! - сказала студия и Я остался сам на сам с чистым недоумением - чяднт? ЗЫ: почему ты в выходной структуре вершинного шейдера семантику цвета определил как тексКоординаты? |
Ответ: Шейдеры + частицы
Да пожалста.
Цитата:
А насчет координат это потому что пиксельный вроде принимает на вход координаты точки в пространстве, её нормаль и её текстурные координаты и все :) То есть если из вершинного надо много передать в пиксельный то в основном это через текстурные координаты делается, их много слоев можно, вроде. Мне хватало. Цитата:
struct VSInput { float4 position : POSITION; float4 blendWeights : BLENDWEIGHT; float4 blendIndices : BLENDINDICES; float3 normal : NORMAL; float4 color : COLOR; float2 texCoords0 : TEXCOORD0; float2 texCoords1 : TEXCOORD1; float3 binormal : BINORMAL; float3 tangent : TANGENT; }; Вот допустимые семантики для данных для вершины к которым ты имеешь доступ из хорса, куда ты можешь засунуть те данные, которые позволят их различить в вершинном. Плюс еще в хорсе есть тайные семантики, которых нет в документации, но которые радикально могут облегчить жизнь :) Плюс вот еще что полезно может быть: В пиксельном у тебя есть координата точки на экране в виде x.y.z.w x/w координаты по высоте экрана, y/w по ширине, а z/w в глубину Координаты там от центра экрана меряются причем единицы соответствуют углам изображения. Какая-то магия матриц:-D Причем z изменяется от 0 до 1, где ноль будет соответствовать ближней плоскости отсечения вида камеры, а 1 дальней. ЗЫ вот еще по частицам что в шагах есть может полезно будет В качестве результата своей работы, вершинные шейдер помет возвращать сле-дующие данные: POSITION0 – трансформированная позиция вершины. COLOR[n] – значение цвета, стоит отметить, что записывать именно цвет сюда вовсе необязательно, например, в случае если необходимо передать в пиксельный шейдер позицию, ее спокойно можно поместить в любое поле с семантикой COLOR или TEXCOORD. TEXCOORD[n] – текстурные координаты. Не обязательно float2 зна-чение, может быть любым в зависимости от ваших нужд (например, для передачи нормали можно использовать float3). FOG – float значения тумана для данной вершины. PSIZE – размер точки. Действует только на точечные спрайты (системы частиц). Например, если нам необходимо рассчитать попиксельное освещение в шейдере, структура выходных данных может быть следующей: |
Ответ: Шейдеры + частицы
Супер, все работает отлично!)
В дальнейшем буду частенько заходить сюда на твой пост поглядеть, почитать))) (см твой пост немного обрезало чтоли) Осталось только одно нерешенное западло: в доке ксорса есть функция: Код:
void xSetEffectFloatArray ( Entity * entity, Код:
void xSetEffectFloatArray ( Entity * entity, |
Ответ: Шейдеры + частицы
Цитата:
|
Ответ: Шейдеры + частицы
Грёбанная срань!!1
Добавил всего ОДНУ сраную строчку (i.color.a -= ((100.0f - (i.color.a / 0.01f)) * 0.1) * i.binormal.z; ) в пиксельный шейдер частиц и производительность сразу упала с 60 до аж 40 фпс!!1 Знал бы что так будет - забил бы на эту тупую идею сразу!!! Да и скорее всего не только поэтому - Я еще слишком туп - никак не ногу додуматься как поворачивать частицы - в мозговом вместилище какая-то какаша из матриц образуется - наверное пока стоит поговнокодить ИИ - чтоб уже наверняка забросить геймдейв :) ЗЫ: извиняюсь, сегодня день тяжелый был, препятствие за препятствием и никакого прогресса - как с этим бороться чтоб не стать эмо или антигероем фильма ужасов?) |
Ответ: Шейдеры + частицы
Цитата:
приведенный тобой код шейдера очень простой, у тебя много частиц полупрозрачных друг поверх друга? сколько? какой эффект ты хочешь ими создать? |
Ответ: Шейдеры + частицы
В Моей "супер-архипупер-мего" игре задумано много чего взрывать - вот и надумал сделать какой-нить более-менее прикольный огонек - и тут в башню Мою влетела вышеописанная формула - где бинормаль это анимационное значение, желательно в диапазоне 0/1 - вроде работает как надо, но тормозно - жуть
Первые два скрина с роковой "строчкой", третий собсно уже без нее Как видно из картинок, Я просто "контрастирую" альфу, и получается прикольный эффект - как будто это не одна частица летит, а несколько маленьких и разных) |
Ответ: Шейдеры + частицы
частиц видимо дохера друг поверх друга, выходит что шейдер считается не 1 раз на каждый пиксель экрана а столько раз, сколько на этом пикселе загораживающих друг друга частиц.
так что видимо надо либо упрощать этот эффект и делать его из меньшего кол-ва частиц, либо рендерить его в лоуресе в отдельную текстуру (так например делали с брызгами воды в анчартеде последнем), либо... хз) что-нибудь ещё сымпровизировать. альфаблендовые поверхности нехило жрут фпс и в реальных играх, помню на gf8600 в MW1 вхождение полностью в дым от гранаты срезало фпс раза в 3-4. |
Ответ: Шейдеры + частицы
И при этом фильтрация стоит "попе"!
рендер в лоу-рес текстуру это идея не плохая ибо игра (по крайней мере в сегодняшней задумке) предполагается быть в низком разрешении (но с сглаживанием в 4х)(так "кинематографичнее") - т е как это сделать? иксРендерЭнтити насколько Я помню, да? И позиция в зд пространнстве сохранится (т е не будет рендерится поверх всех остальных энтити)? НО! - если игра будет в лоу-рес разрешении то и отпадает смысл в вышеописанном способе рендера частиц - тогда Все О"К))) И вопрос: взгляните на код шейдера выше (плюс указания dsd) - ок, да?) - теперь составьте в уме "апдейт" - через бинормаль посылаю значение ротации - ОК - как повернуть спрайт? Можете ответить двумя вариантами: 1 - это элементарно! думай САМ, идиот!!1 (и Я потрачу кучу дней на самостоятельный поиск ответа (ёбанная работа, свободного времени почти нету)) 2 - описывается код или представляется он Сам, с комментариями, чтобы лашпёд АНИК123 все догнал и не доставал больше великих гуру деградатскими вопросами))) И еще: часто бывают ошибки при компиляции, вызванные неправильно инициализируемыми входными параметрами функции/члена, вопрос к сверх опытным разработчикам: это связано с... ЧЕМ?!? Есть класс (кл0), есть в нем функция-х**, есть в Ней входной параметр: указатель на класс (кл1), содержащий хэндл - при попытке выполнить некое действие над этим хэндлом приводит к краху, хоть при загрузке самого хэндла (в кл1) все ОК, ибо возвращается не НОЛЬ (если есть более нормальные проверки - искренне прошу поделиться) Не знаю связано ли это с вышеописанным, но: есть функция, есть входной параметр char[32], и - блин, это капец! - в нем "сидит" набор СОВСЕМ лёвых символов вместо передаваемых функции! С чем это может быть связано? (самое страшно то, что это возникло в коде который Я ранее написал - и он Работал! - теперь, вставив его, получилась такая вот жопа, хотя по Идее Все должно "пахать") Я в тупике (собсно Я как раз изложил Все "жопы" которые сопутствували Меня в этот день (когда писал пост выше)) Как всегда, прошу помочь - ибо Я уже забрасывал проЭктЬ - как раз из за таких-вот мелочей - и тупо принимался писать Все с нуля На этот раз Я не хочу так делать - если идти, то до конца, или в жопу мойсеева - первый исход событий Мне более по душе Заранее спасибо, как всегда, Ваш АНИК 123))))))) |
Ответ: Шейдеры + частицы
А чем тебя sin и cos не устраивают? Смещения у тебя есть же. Вот и будет:
x'=x * cos a+y * sin a; y'=-x * sin a+y * cos a; Оно? Поворот осей называется. |
Ответ: Шейдеры + частицы
Цитата:
float c = cos(rotation); float s = sin(rotation); float4 rotationMatrix = float4(c, -s, s, c); Position.xy = mul(Position.xy, float2x2(rotationMatrix)); --- пока писал, поста dsd не было, его вариант ничем не хуже. |
Ответ: Шейдеры + частицы
как-то так получилось
правда весьма непроизводительно получилось как можно оптимизировать? Код:
float4x4 matWorld : MATRIX_WORLD; |
Ответ: Шейдеры + частицы
Цитата:
может как-то так? o.position.xy += sign(i.texCoords.xy) * i.binormal.xy; |
Часовой пояс GMT +4, время: 11:10. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot