forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Xors3D. Шейдеры. Урок первый (http://forum.boolean.name/showthread.php?t=8564)

CRASHER 13.03.2011 13:41

Ответ: Xors3D. Шейдеры. Урок первый
 
Dzirt, в этом уроке не все описанно. Он хоть и полезный, но искать по интернету что в нём упущенно мне представляется не правельным. Да и сам заголовок его подразумивает продолжение.
Кстати, может тогда где нибудь указать ссылки на уроки, которые показались, на взгляд авторов первого урока, полезными.

Mr_F_ 13.03.2011 15:52

Ответ: Xors3D. Шейдеры. Урок первый
 
Больше всего рекомендую просто изучать чужие шейдеры, пробовать их менять и смотреть на результат, пробовать копировать из них куски, так постепенно поймёшь что как работает. Ну и ещё изучай хелп по HLSL из DXSDK.

CRASHER 13.03.2011 20:49

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 182645)
Больше всего рекомендую просто изучать чужие шейдеры, пробовать их менять и смотреть на результат, пробовать копировать из них куски, так постепенно поймёшь что как работает. Ну и ещё изучай хелп по HLSL из DXSDK.

Скажи где его найти пжалуйста.

Mr_F_ 14.03.2011 17:40

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Скажи где его найти пжалуйста.
на MSDN

CRASHER 14.03.2011 22:56

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 182770)
на MSDN

а где найти MSDN скажи? Вот я вот поражаюсь, ну не может уважающий себя геймдейвер вставить в свой пост ,превозмогая себя, и тем самым сильно усложняя себе жизнь, ссылку.

baton4ik 14.03.2011 23:05

Ответ: Xors3D. Шейдеры. Урок первый
 
Вот я вот поражаюсь, ну не может уважающий себя геймдейвер ,превозмогая себя, и тем самым сильно усложняя себе жизнь, найти сам.
Смотри-ка, первая ссылка: http://www.google.com.ua/search?clie...hannel=suggest

CRASHER 14.03.2011 23:12

Ответ: Xors3D. Шейдеры. Урок первый
 
baton4ik, ты опоздал я там уже был. Ты думаешь я что то нашел? Если ты нашел давай ссыль пжлст

CRASHER 15.03.2011 00:17

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от baton4ik (Сообщение 182804)
Вот я вот поражаюсь, ну не может уважающий себя геймдейвер ,превозмогая себя, и тем самым сильно усложняя себе жизнь, найти сам.
Смотри-ка, первая ссылка: http://www.google.com.ua/search?clie...hannel=suggest

baton4ik, судя по тому как ты cпешиш дать ссылку ничего там нет, и ты нипупа не можеш найти, так что прежде чем умничать сам бы чтонибудь поискал.

moka 15.03.2011 00:26

Ответ: Xors3D. Шейдеры. Урок первый
 
CRASHER, а тебе кто-то обязан за твою слабость перед малейшими трудностями?
Ты не способен выполнить элементарную задачу, и уже тычешь на других, не осознавая своего недовольства к себе, за то что сам не способен.

По запросу msdn - первая ссылка, имеет свой поиск сверху, по нужному запросу сразу даёт что нужно.
По запросу в гугле dxsdk - сразу выдаёт первую ссылку на список вариантов скачиваний, вторую сразу скачивать, а третью на страницу для разработчиков.

Слушай лентяй, харе с такими запросами тут окошеливаться, если сам ничего не можешь сделать, тебе никто не будет помогать ничего, зачем? Ты же не способен учится получается, и кому нужно тащить такого лентяя у себя на плечах?

baton4ik, открыл гугл и нашёл чё нада, а ты его ещё в этом обвиняешь?

CRASHER 15.03.2011 00:57

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от MoKa (Сообщение 182809)
CRASHER, а тебе кто-то обязан за твою слабость перед малейшими трудностями?
Ты не способен выполнить элементарную задачу, и уже тычешь на других, не осознавая своего недовольства к себе, за то что сам не способен.

По запросу msdn - первая ссылка, имеет свой поиск сверху, по нужному запросу сразу даёт что нужно.
По запросу в гугле dxsdk - сразу выдаёт первую ссылку на список вариантов скачиваний, вторую сразу скачивать, а третью на страницу для разработчиков.

Слушай лентяй, харе с такими запросами тут окошеливаться, если сам ничего не можешь сделать, тебе никто не будет помогать ничего, зачем? Ты же не способен учится получается, и кому нужно тащить такого лентяя у себя на плечах?

baton4ik, открыл гугл и нашёл чё нада, а ты его ещё в этом обвиняешь?

Первый раз в жизни потребовал помощи и тут я уже всю жизнь кого то дастаю. Что я сделаю, если я найти не могу??? я пролазил и первую страницу в гугле и вторую. Мне не нужен DXSDK. Мне хелп нужен. А вот от тебя мока я не ожидал такого реского ответа, мдаа, последнее время что то совсем стало плохо на форумах.

moka 15.03.2011 03:24

Ответ: Xors3D. Шейдеры. Урок первый
 
По запросу "dxsdk documentation", первая ссылка, снизу слева под секцией "3", Documentation.

Приношу извинения, набросился и не по делам на самом деле. Просто эмоции - этим мы все обладаем, но читая посты в топике, показалось явное не отличие от предыдущих вопросителей, которые в гугле не искали.
ИМХО, гугло-скилл - неотъемлемая часть набора способностей программиста.

CRASHER 15.03.2011 04:48

Ответ: Xors3D. Шейдеры. Урок первый
 
MoKa, спасибо, я тож конечно не самым лучшим образом отвечал, на меня не похоже. Принашу глубочайшие извинения MR_F если его обидел.
Вообще проблема в чем я пытаюсь изучить шейдеры. Для этого мне посоветовали хелпы по HLSL и DXSDK? Но понятия это растяжимые хелпы, и следовательно не зная что искать я не знаю даже как спросить. Спрошу тогда так, что бы ты ,MoKa, стал учить после вышеописанного урока по шейдерам?

moka 15.03.2011 13:24

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

Лучше всего когда понимаешь как шейдерный конвеер работает и как передедавать переменные и как из вершинного в попиксельный шейдер передаются данные. Для это напиши простой шейдер - простой диффуз. При этом попробуй это сделать без единого копипаста, но можно смотреть в чужой шейдер.
Разбери его до мелчайших деталей. В msdn на HLSL есть хорошая инфа о тех или иных общих момментах.
Далее усложняй, но важно понять представление вершины и пикселя в шейдере, "как шейдер видит" их :)
Тогда будет проще далее.

CRASHER 15.03.2011 15:45

Ответ: Xors3D. Шейдеры. Урок первый
 
Ладно, будем пытать Ся :)

CRASHER 15.03.2011 21:22

Ответ: Xors3D. Шейдеры. Урок первый
 
Пасибо мока сочитание терминов msdn и HLSL привели меня на ссылку где какраз то что я искал. С этого можно продолжить свое обучение шейдерам.
http://www.gamedev.ru/code/terms/HLSL?page=2
Советую после изучения первого урока полазать по ссылкам в конце этой странице всем несведующим :)

pepel 08.12.2011 17:55

Ответ: Xors3D. Шейдеры. Урок первый
 
а можно пример простого шейдера который тупо окрашивает обьект в белый цвет?

moka 08.12.2011 17:59

Ответ: Xors3D. Шейдеры. Урок первый
 
http://moka.ucoz.ru/load/0-0-0-102-20

pepel 08.12.2011 18:00

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от MoKa (Сообщение 213060)

спасибо. будем разбираться..

pepel 08.12.2011 20:46

Ответ: Xors3D. Шейдеры. Урок первый
 
кстати вопрос такой.
в примерах используется такой вариант передачи матриц:
float4x4 view_proj_matrix; - в шейдере
и xSetEffectMatrixSemantic poly, "MatWorldViewProj", WORLDVIEWPROJ в ксорсе


а в уроке тупо в шейдере float4x4 viewprojMatrix : MATRIX_VIEWPROJ;

т.е. эти варианты делают по сути одно и тоже?

moka 08.12.2011 20:54

Ответ: Xors3D. Шейдеры. Урок первый
 
Да, с одним отличем как эта матрица задаётся. В первом варианте, нада ручками указывать матрицу, а во втором, она будет автоматически назначена, исходя из объекта на который шейдер наложен. Второй лучше, если это не нужно менять из кода (не могу придумать необходиомсти), так что юзай второй.
Это называется семантики. В документации есть раздел про семантики.

ANIK123 30.12.2011 09:33

Ответ: Xors3D. Шейдеры. Урок первый
 
Привет Всем!)
Первый раз познакомился с написанием шейдеров вчера, ради постэффектов т к в основном для обьектов нужен только обычный диффуз)
Прошу помощи в реализации одной штуки:
возможно ли как нибудь использовать в шейдере внешнюю функцию? например для передачи положения текущего пикселя в двиг, чтобы сгенерировать маску (чтобы некий пост-эффект действовал только на некоторые обьекты) ? или может как то по другому можно? ибо через камераПик ну ооочень тормозно получается)

UPD: а что если изменить активный буффер на другой, отрендерить в него нужные шейдеры, перепригнуть на начальный буффер, отрендерить еще раз с нормальными шейдерамы и наложенным пост-эффектом с маской созданной в предыдущем буффере?

moka 08.01.2012 05:46

Ответ: Xors3D. Шейдеры. Урок первый
 
Т.к. ты только начал заниматься шейдерами, то ещё думаешь совсем в иной парадигме.
Суть шейдеров - математически обрабатывать тексели, и не более.
Зная на что шейдер как механизм может, ты будешь знать что можно с ними делать, а что нет (например передать какую-то внешнюю функцию, невозможно, да и зачем, если есть внутренние?).
Далее понимая возможности математики, и смекалки, сможешь придумать реализацию идеи.

Как я понял, тебе нужно обработать пост эффектом только конкретный объект.
Если там нету блуров, и тексели которые нужно обработать постом находятся прямо на нужном объекте, то можно применить алгоритм пост обработки, на сам объект, заранее получив позицию пикселя в скринспейсе (если это нужно для пост обработки).
А можно отрендерить маску, в отдельную текстуру, и затем по маске делать пост обработку, или смешивать пост обработанную текстуру с нормальной.

Короче, вариантов много, зависит всё от деталей. Каждый из них имеет свои недостатки, экспериментируй - это лучший вариант изучить шейдеры.

LLI.T.A.L.K.E.R. 25.03.2012 08:46

Ответ: Xors3D. Шейдеры. Урок первый
 
Хотелось бы узнать, насколько баловство с шейдерами на этом сайте поможет общему применению. Есть ли отличия в написании кода? Значительны ли они?
Заранее благодарю.

Markova 25.03.2012 15:41

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от LLI.T.A.L.K.E.R. (Сообщение 223632)
Хотелось бы узнать, насколько баловство с шейдерами на этом сайте поможет общему применению. Есть ли отличия в написании кода? Значительны ли они?
Заранее благодарю.

В плане синтаксиса отличий нет, не имеет значения, где в последствие ты будишь использовать свои знания.

ANIK123 14.04.2012 02:41

Ответ: Xors3D. Шейдеры. Урок первый
 
Мужики, не получается применить пиксельный шейдер к спрайту - на иных объектах все ок, вопрос: есть ли какой-то специальный подход к спрайтам или к ним тупо не можно применять шейдеры вообще?

moka 14.04.2012 20:35

Ответ: Xors3D. Шейдеры. Урок первый
 
Есть объект Poly, можешь его создавать и применять шейдер на него.

ANIK123 14.04.2012 22:04

Ответ: Xors3D. Шейдеры. Урок первый
 
При чем здесь полигоны? У спрайта их и так двое + в семантике шейдеров есть такая штука как PSIZE - специально для спрайтов
так почему же не получается?
Код:

Handle sprite = xCreateSprite();
Handle sha = xLoadFXFile("shaders//exp.fx");
xSetEntityEffect(sprite, sha);

Код:

texture diffuseTexture : TEXTURE_0; //текстура

//описываем сэмплер:
sampler diffuseSampler = sampler_state
{
        Texture = <diffuseTexture>; //привязываем текстуру
        //устанавливаем адресацию координат
        AddressU = WRAP;
        AddressV = WRAP;
        AddressW = WRAP;
        //устанавливаем фильтрацию
        MinFilter = ANISOTROPIC;
        MagFilter = ANISOTROPIC;
        MipFilter = ANISOTROPIC;
        //устанавливаем уровень фильтрации
        MaxAnisotropy = 4;
};

struct PSInput
{
        float2 texCoords : TEXCOORD0;
};

struct PSOutput
{
        float4 color : COLOR;
};

//пиксельный шейдер
PSOutput PSMain (PSInput input)
{
        PSOutput output;
        output.color.rgba = tex2D(diffuseSampler, input.texCoords).rgba;
        output.color.a = 0.1f;
        //output.color.rgb = (output.color.r + output.color.g + output.color.b) / 3;
        output.color.rgb = (0.0f, 0.0f, 0.0f);
        return output;
}

technique MainTechnique
{
        // Sequence of technique passes. This passes will performs on stage.
        pass p
        {
                AlphaBlendEnable= 1;
                PixelShader        = compile ps_3_0 PSMain();
        }
}

так можно ли как-нить закинуть шейдер на спрайт?

_____UPD__________________________________________________ _______________________________________
Аууу....))) Налипать текстурки весело, а с шейдерамы еще веселее)))))))

burovalex 29.10.2012 00:04

Ответ: Xors3D. Шейдеры. Урок первый
 
Knightmare
дружище, перезалей пожалуйста, почитать хочется :)

FREE MAN 29.10.2012 00:55

Ответ: Xors3D. Шейдеры. Урок первый
 
Держи http://area.xors3d.com/depository/do...first-steps-ru

Sapik 21.12.2013 01:41

Ответ: Xors3D. Шейдеры. Урок первый
 
Всем привет.Такой вапрос,есть анемированная модель (рук с оружием) руки скин на костях оружие нет, загружаю xloadanimmesh парент к камере, работает хорошо но как только накладываю шеидер вамп, с оружием все нормально а руки меняют координаты xpositionentity ? Что делаю не так? Изените есле не понятно выразил проблему.

FREE MAN 21.12.2013 19:09

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Sapik (Сообщение 271721)
Всем привет.Такой вапрос,есть анемированная модель (рук с оружием) руки скин на костях оружие нет, загружаю xloadanimmesh парент к камере, работает хорошо но как только накладываю шеидер вамп, с оружием все нормально а руки меняют координаты xpositionentity ? Что делаю не так? Изените есле не понятно выразил проблему.

если ты используешь стандартный шейдер из поставки ксорса то он для статики, вот такая хрень и происходит, нужно курить другой шейдер, или дописывать стандартный.

Sapik 22.12.2013 14:02

Ответ: Xors3D. Шейдеры. Урок первый
 
Вззял стандартный шейдер (skining) дописал к нему бамп,все работает отлично (руки) на месте,но вот (оружиие) оно статично поетому его не видно.Возможно ли совместить статику и скин в одном шейдере? Или грузить отдельно ( xloadanimmesh (руки)) и одельно (xloadanlmmesh (оружие)) и парент (оружие,руки) может кто подскажет как правельнее или где я торможу,да и спасиба за ответ.

tirarex 22.12.2013 14:30

Ответ: Xors3D. Шейдеры. Урок первый
 
xgetchild()
xfindchild()

руки отдельно а оружие отдельно выбираешь и применяешь шейдеры

Sapik 22.12.2013 21:43

Ответ: Xors3D. Шейдеры. Урок первый
 
Я догадалса так применить но я заметел что на скин (руки) ИСТОЧНИК СВЕТА действует с одной стороны.Какбудто загрузилась модель в координаты 0,0,0 а СВЕТ 15,10,-5 хоть модель и парент( камерае) при перемищении позиция источника света не меняется только при повороте камеры и так в любых координатах сцены.Подскажите где мой косяк.

Sapik 26.12.2013 16:14

Ответ: Xors3D. Шейдеры. Урок первый
 
Всем доброго.Кто небуть писал шеидер для (skin) с источником света, diffuse+bamp+specular я понимаю что вапрос звучит так буто я выпрашеваю но мне любые подсказки будут полездны.Так как шеидеры только осваеваю.

Colossus 13.02.2014 04:19

Ответ: Xors3D. Шейдеры. Урок первый
 
Sapik

Чел. Ты меня конечно извини, но тебе бы русский язык для начала освоить...

Sapik 13.02.2014 15:18

Ответ: Xors3D. Шейдеры. Урок первый
 
Colossus и это все что ты можеш написать про шеидер

moka 13.02.2014 15:47

Ответ: Xors3D. Шейдеры. Урок первый
 
Ты то что пытаешься выразить не можешь нормально написать.

Sapik 13.02.2014 19:26

Ответ: Xors3D. Шейдеры. Урок первый
 
moka.Твои примеры очень понятны.Но они для статики.Жаль что нет для скина с источником света.Я пробывал к примеру шейдера (skining) дописать источник света с (bamp) , частично используя твой шейдер.Источник света есть, но координаты источника света привязаны к скину и риагируют только на вращение.Надеюсь понятно выражаю суть проблемы.

moka 13.02.2014 22:03

Ответ: Xors3D. Шейдеры. Урок первый
 
При скине у тебя есть позиции текстелей и их нормали в статическом состоянии и в локальном пространстве модели, далее ты применяешь матрицу на нормали и позицию, тем самым получаешь уже анимированную позицию и нормали текселя, далее применяешь матрицу трансформации самого объекта, таким образом у тебя будут доступны позиция и нормаль текселя с учётом скиннинга, и уже применяешь свет как обычно.

CRASHER 06.04.2014 21:36

Ответ: Xors3D. Шейдеры. Урок первый
 
Когдаж второй урок выдет?)

Izunad 26.04.2014 13:56

Ответ: Xors3D. Шейдеры. Урок первый
 
Ссылка битая

Arton 26.04.2014 15:44

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Izunad (Сообщение 279476)
Ссылка битая

Недавно сайт окончательно сдох. А самая первая ссылка ещё раньше.
Shaders in Xors3d Engine. First steps (RU).pdf

pozitiffcat 26.04.2014 19:18

Ответ: Xors3D. Шейдеры. Урок первый
 
первый и последний

Izunad 27.04.2014 00:17

Ответ: Xors3D. Шейдеры. Урок первый
 
Первый шейдер, добавляет зеленный оттенок текстуре =)
Код:

static float4 Colorka : COLOR0;
texture diffuseTexture : TEXTURE_0;

sampler diffuseSampler = sampler_state
{
        Texture = <diffuseTexture>;
        AddressU = WRAP;
        AddressV = WRAP;
        AddressW = WRAP;
        MinFilter = ANISOTROPIC;
        MagFilter = ANISOTROPIC;
        MipFilter = ANISOTROPIC;
        MaxAnisotropy = 4;
};

struct PSInput
{
        float2 texCoords : TEXCOORD0;
};

struct PSOutput
{
        float4 color : COLOR;
};

PSOutput PSMain (PSInput input)
{
        PSOutput output;
        Colorka = float4(0,0.1,0,0);
        output.color.rgba = tex2D(diffuseSampler, input.texCoords).rgba+Colorka;
        return output;
}

technique MainTechnique
{
        pass p
        {
                PixelShader        = compile ps_2_0 PSMain();
        }
}


Izunad 27.04.2014 00:30

Ответ: Xors3D. Шейдеры. Урок первый
 
А вот еще. Заменяет зеленые оттенки на синие.
Код:

static float4 Colorka : COLOR0;
static float Bconst: COLOR1;
texture diffuseTexture : TEXTURE_0;

sampler diffuseSampler = sampler_state
{
        Texture = <diffuseTexture>;
        AddressU = WRAP;
        AddressV = WRAP;
        AddressW = WRAP;
        MinFilter = ANISOTROPIC;
        MagFilter = ANISOTROPIC;
        MipFilter = ANISOTROPIC;
        MaxAnisotropy = 4;
};

struct PSInput
{
        float2 texCoords : TEXCOORD0;
};

struct PSOutput
{
        float4 color : COLOR;
};

PSOutput PSMain (PSInput input)
{
        PSOutput output;
        Colorka = tex2D(diffuseSampler, input.texCoords).rgba;
        Bconst = Colorka.b;
        Colorka.b = Colorka.g;
        Colorka.g = Bconst;
        output.color.rgba = Colorka;
        return output;
}

technique MainTechnique
{
        pass p
        {
                PixelShader        = compile ps_2_0 PSMain();
        }
}

А можно сделать так? Спроектировать от нормали по оси У вверх вектор, который проверит пересекает вектор какую либо полигон. Если да, то закрасить пиксель в тень.

tirarex 28.04.2014 22:38

Ответ: Xors3D. Шейдеры. Урок первый
 
Izunad Гугли Shadowmap

Ну или моя поделка http://gcup.ru/board/com/active/xors...ading/1-1-0-22

LLI.T.A.L.K.E.R. 29.04.2014 14:05

Ответ: Xors3D. Шейдеры. Урок первый
 
Кстати использовал два готовых примера shader-теней.
В последний момент решил воспользоваться alpha и transparent текстурами.

До обработки они прозрачны, после затенения - не прозрачные но с тенями.
(ну я решил прозрачные меши рендерить отдельно от теней)

А так, например как в Blender картинке:


Или например травы..

Просто я с шейдерами никогда не связывался.
В общем стандартные прозрачности исчезают после обработки.

moka 01.05.2014 04:04

Ответ: Xors3D. Шейдеры. Урок первый
 
Забей на alpha канал и тени, даже пока не суйся туда, лучше займись более важными вещами с шейдерами.

Izunad 01.05.2014 21:19

Ответ: Xors3D. Шейдеры. Урок первый
 
А вотя мой шейдер воды

Код:

//КОД ШЕЙДЕРА
static float4 Colorka : COLOR0;
const float UPSTimer;
texture diffuseTexture : TEXTURE_0;
texture diffuseTexture1 : TEXTURE_1;
float3 PosCamera;

sampler diffuseSampler = sampler_state
{
        Texture = <diffuseTexture>;
        AddressU = WRAP;
        AddressV = WRAP;
        AddressW = WRAP;
        MinFilter = ANISOTROPIC;
        MagFilter = ANISOTROPIC;
        MipFilter = ANISOTROPIC;
        MaxAnisotropy = 4;
};

sampler diffuseSampler1 = sampler_state
{
        Texture = <diffuseTexture1>;
        AddressU = WRAP;
        AddressV = WRAP;
        AddressW = WRAP;
        MinFilter = ANISOTROPIC;
        MagFilter = ANISOTROPIC;
        MipFilter = ANISOTROPIC;
        MaxAnisotropy = 4;
};

struct PSInput
{
        float2 texCoords : TEXCOORD0;
};

struct PSOutput
{
        float4 color : COLOR;
};

PSOutput PSMain (PSInput input)
{
        PSOutput output;
        Colorka =(tex2D(diffuseSampler, input.texCoords+float2(0,UPSTimer))+tex2D(diffuseSampler1, input.texCoords-float2(UPSTimer,UPSTimer))+tex2D(diffuseSampler1, input.texCoords-float2(UPSTimer,-UPSTimer)));
        Colorka.a = Colorka.r;
        if (Colorka.a > 0.75f)
                {
                        Colorka.r=(1-Colorka.r)/4+Colorka.r;
                        Colorka.g=(1-Colorka.g)/4+Colorka.g;
                        Colorka.b=(1-Colorka.b)/4+Colorka.b;
                }
        if (Colorka.a > 0.90f)
                {
                        Colorka.r=1;
                        Colorka.g=1;
                        Colorka.b=1;
                }
        Colorka.a = Colorka.a;
        Colorka.b = Colorka.b*2;
        Colorka.g = Colorka.b;
        Colorka.rgb=Colorka.rgb/4;
        output.color.rgba = Colorka;
        return output;
}

technique MainTechnique
{
        pass p
        {
                AlphaBlendEnable= true;
                PixelShader        = compile ps_2_0 PSMain();
        }
}

На стороне кода игры
Код:

Define tModel=xLoadMesh("Resurse\Models\Water\Model.b3d");Плоскость
Define tShader = xLoadFXFile("Resurse\Shaders\Water2.fx")
Define tTextureDiffuse.i=xLoadTexture("Resurse\Shaders\W1.png")
Define tTextureDiffuse1.i=xLoadTexture("Resurse\Shaders\W2.png")
xSetEntityEffect(tModel,tShader)
xSetEffectTechnique(tModel,"MainTechnique")
xSetEffectTexture(tModel,        "diffuseTexture",tTextureDiffuse)
xSetEffectTexture(tModel,        "diffuseTexture1",tTextureDiffuse1)
Define UPSTimer.f=0

;В цикле пишем
UPSTimer=UPSTimer+0.00025
xSetEffectFloat(tModel,                "UPSTimer",UPSTimer)

Нам также понадобится две текстуры W1 W2. В примерах Xors3D есть два png изображения Fire_NormalF.png и Fire_NormalS.png. Меняем их в редакторе, придавая оттенки серого.


moka 02.05.2014 02:16

Ответ: Xors3D. Шейдеры. Урок первый
 
Водичку нужно в анимации смотреть :)

Советую не использовать условия в шейдерах - они очень медленные.

Mr_F_ 02.05.2014 02:24

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Советую не использовать условия в шейдерах - они очень медленные.
необязательно.
варианта два - компилятор решает какой выбрать:
1. то что в ифе выполняется в любом случае, а потом умножается на маску условия.
2. происходит реальный бранч. в этом случае, надо иметь в виду, что видюха обрабатывает много пикселей параллельно - в квадратных блоках (4х4 пикселя вроде обычно).
если один пиксель в блоке выполняет длинный бранч, а другие не выполняют - другим все равно придётся ждать этот один пиксель, как будто иф сработал на них всех.
если зоны с разными бранчами чётко отделены на экране, а не шумно перемешаны - то будет норм работать.
также, в бранчах не работает tex2D - но работает tex2Dlod/tex2Dgrad.

нормальные бранчи пашут только в sm 3.0 и выше.
компилер выбирает их если внутри нет tex2D и код более менее не однострочный вроде как.

код выше по хорошему должен компильнуться в вариант 1

----
Цитата:

if (Colorka.a > 0.75f)
{
Colorka.r=(1-Colorka.r)/4+Colorka.r;
Colorka.g=(1-Colorka.g)/4+Colorka.g;
Colorka.b=(1-Colorka.b)/4+Colorka.b;
}
if (Colorka.a > 0.90f)
{
Colorka.r=1;
Colorka.g=1;
Colorka.b=1;
}
Colorka.a = Colorka.a;
Colorka.b = Colorka.b*2;
Colorka.g = Colorka.b;
Colorka.rgb=Colorka.rgb/4;
output.color.rgba = Colorka;
кстати, нафиг по компонентам так расписывать - ты же можешь с векторами сразу работать:

Код:

Colorka.rgb = Colorka.a>0.75? (1-Colorka.rgb)/4+Colorka.rgb : Colorka.rgb;
Colorka.rgb = Colorka.a>0.9?    1 : Colorka.rgb;
Colorka.abg = Colorka.abb;
Colorka.b *= 2;
Colorka.rgb /= 4;


Izunad 02.05.2014 09:32

Ответ: Xors3D. Шейдеры. Урок первый
 
Объясните пожалуйста басяцким языком что такое вектор Бинормали и Тангент?

tirarex 02.05.2014 11:50

Ответ: Xors3D. Шейдеры. Урок первый
 

moka 03.05.2014 04:22

Ответ: Xors3D. Шейдеры. Урок первый
 
Нормаль обычно перпендикулярна поверхности.
Тангент перпендикулярен нормали и бинормали, и паралелен Y координате в текстурных координатах.
Бинормаль, перпендикулярен нормали и тангенту, и паралелен X координате в текстурных координатах.

Это нужно для того чтобы взять нормал карту (текстуру), извлечь из неё X и Y смещение, но оно же локально на текстуре, и далее используя нормаль, тангент и бинормаль, повернуть этот полученный вектор смещения из локального пространства в мировое.
Чтобы можно было уже далее использовать эти данные с другими, например вектором луча света от источника света, который тоже в мировом пространстве.

Любые операции над любыми данными, нужно производить в одном пространстве, это может быть локальное (local), мировое (world) или экранное (screen). Если какие-то данные в другом пространстве, то нужно их трансформировать в нужное, и для этого порой хватает только матрицы трансформации (local > world), проекционной матрицы (world > screen), а для текстурных, таких как нормал карта, нужны tbn (tanget, binormal, normal)

tirarex 03.05.2014 17:17

Ответ: Xors3D. Шейдеры. Урок первый
 
Вложений: 1
Мой семпл BPCM (Box Projected Cube Map)


Автогенератор нормалей (Приятная мелочь)


float3 AutoNormalGen(sampler2D sample,float2 texCoord) {
float off = 1.0 / 512;
float4 lightness = float4(0.2,0.59,0.11,0);
// Take all neighbor samples
float4 s00 = tex2D(sample, texCoord + float2(-off, -off));
float4 s01 = tex2D(sample, texCoord + float2( 0, -off));
float4 s02 = tex2D(sample, texCoord + float2( off, -off));

float4 s10 = tex2D(sample, texCoord + float2(-off, 0));
float4 s12 = tex2D(sample, texCoord + float2( off, 0));

float4 s20 = tex2D(sample, texCoord + float2(-off, off));
float4 s21 = tex2D(sample, texCoord + float2( 0, off));
float4 s22 = tex2D(sample, texCoord + float2( off, off));

// Slope in X direction
float4 sobelX = s00 + 2 * s10 + s20 - s02 - 2 * s12 - s22;
// Slope in Y direction
float4 sobelY = s00 + 2 * s01 + s02 - s20 - 2 * s21 - s22;

// Weight the slope in all channels, we use grayscale as height
float sx = dot(sobelX, lightness);
float sy = dot(sobelY, lightness);

// Compose the normal
float3 normal = normalize(float3(sx, sy, 1));

// Pack [-1, 1] into [0, 1]
return normal * 0.5 + 0.5;
}

Samodelkin 03.05.2014 22:39

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_
необязательно.
варианта два - компилятор решает какой выбрать:

Ещё можно указать явно:
Код:

[ branch ] if ( ... ) { ... }
Для if и switch можно указывать branch или flatten, соответственно динамически или нет.
Для for, while можно указать unroll( x ) или loop, первый разворачивает цикл, в необязательном параметре можно указать насколько развернуть, loop - цикл не разворачивается.

tirarex 10.05.2014 11:14

Ответ: Xors3D. Шейдеры. Урок первый
 
Вот такой вопрос .
Делаю спотлайт для деферреда и настигла проблема .

Код спотлайта

cD = cD * cLightColor;
float3 vLight = normalize(vLightPos - vWorldPos.xyz);
float NdotL = max(0.0f, dot(vNormal, vLight));
float cosAngle = max(0.0f, dot(-vSpotLightDir, vLight));
float resi = saturate(1.0f - distance(vWorldPos.xyz, vLightPos) / fLightRadius);
float spotAtten = smoothstep(vLightAngles.x, vLightAngles.z, cosAngle);
cD=cD*(NdotL*spotAtten);

из кода
xSetEffectVector gPostPoly,"vLightAngles",0.1,0,numval(180)


Чем больше vLightAngles.z тем ярче спотлайт
в итоге я получаю еле светлый свет при яркости 255(1в шейдере).
Как исправить я даже не знаю

Izunad 08.06.2014 19:48

Ответ: Xors3D. Шейдеры. Урок первый
 
Ребят, а можно както заиндексировать текстурки?

Пробывал сделать так:
разместил на текстуру 512х512 16 текстурок по 128х128;
Оказалось что такое не прокатывает ибо изза фильтрации по краю тайла выводятся цвета соседнего тайла

Mr_F_ 08.06.2014 20:24

Ответ: Xors3D. Шейдеры. Урок первый
 
нужно делать спец края вокруг тайлов. т.е. ещё несколько пикселей продолжения тайла в бока, и выборку менять, чтобы брать квадрат без краёв этих. тогда фильтроваться нормально будет.
если тексы одного размера, можно в 3д текстуру положить и выбирать слои её. ну и на дх10+ на это есть текстурные массивы.

Izunad 08.06.2014 21:35

Ответ: Xors3D. Шейдеры. Урок первый
 
Хм, оказалось что проблема даже не из за "соседних тайлов", так как я размножил один тот же тайл по всей текстуре, но при прорисовке видна грань с цветом от пикселя 0:0


Код:

static float4 Colorka : COLOR;
texture Texture000: TEXTURE;

sampler Sampler1 = sampler_state
{
        Texture = <Texture000>;
};

struct PSInput
{
        float2 texCoords : TEXCOORD0;
};

float4 PSMain (PSInput input): COLOR {
        Colorka=tex2D(Sampler1,input.texCoords%0.25f);
        return float4(Colorka);
}

technique MainTechnique
{
        pass p
        {
                AlphaBlendEnable = 1;
                PixelShader        = compile ps_2_0 PSMain();
        }
}

Получается что когда input.texCoords почти кратна 0.25f он высчитывает цвет из координатов 0.0f

Izunad 08.06.2014 21:56

Ответ: Xors3D. Шейдеры. Урок первый
 
Проблема решаема. Оказывается работает так input.texCoords%0.1 или input.texCoords%0.2 0.3 0.4 0.5 и так далее, главное чтобы после запятой была одна цифра. + дополнительные грани от Mr_F_

Izunad 12.06.2014 19:49

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

если тексы одного размера, можно в 3д текстуру положить и выбирать слои её
А можно поподробнее, что такое 3д текстура для начала?

moka 12.06.2014 20:34

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Izunad (Сообщение 282542)
А можно поподробнее, что такое 3д текстура для начала?

http://gamedev.stackexchange.com/que...re-3d-textures
GOOGLE?

Я не зануда, но это на столь уже базовые знания везде пережованные...


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

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