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)

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;
}


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

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