|
Xors3D Графический движок с поддержкой DirectX9 |
26.04.2014, 13:56
|
#106
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Ссылка битая
|
(Offline)
|
|
26.04.2014, 15:44
|
#107
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,023
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Сообщение от Izunad
Ссылка битая
|
Недавно сайт окончательно сдох. А самая первая ссылка ещё раньше.
Shaders in Xors3d Engine. First steps (RU).pdf
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.04.2014, 19:18
|
#108
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
первый и последний
|
(Offline)
|
|
27.04.2014, 00:17
|
#109
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Ответ: 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();
}
}
|
(Offline)
|
|
27.04.2014, 00:30
|
#110
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Ответ: 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();
}
}
А можно сделать так? Спроектировать от нормали по оси У вверх вектор, который проверит пересекает вектор какую либо полигон. Если да, то закрасить пиксель в тень.
Последний раз редактировалось Izunad, 27.04.2014 в 14:03.
|
(Offline)
|
|
28.04.2014, 22:38
|
#111
|
Бывалый
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений (для 866 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
|
(Offline)
|
|
29.04.2014, 14:05
|
#112
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Кстати использовал два готовых примера shader-теней.
В последний момент решил воспользоваться alpha и transparent текстурами.
До обработки они прозрачны, после затенения - не прозрачные но с тенями.
(ну я решил прозрачные меши рендерить отдельно от теней)
А так, например как в Blender картинке:
Или например травы..
Просто я с шейдерами никогда не связывался.
В общем стандартные прозрачности исчезают после обработки.
|
(Offline)
|
|
01.05.2014, 04:04
|
#113
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Забей на alpha канал и тени, даже пока не суйся туда, лучше займись более важными вещами с шейдерами.
|
(Offline)
|
|
01.05.2014, 21:19
|
#114
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Ответ: 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. Меняем их в редакторе, придавая оттенки серого.
|
(Offline)
|
|
Эти 6 пользователя(ей) сказали Спасибо Izunad за это полезное сообщение:
|
|
02.05.2014, 02:16
|
#115
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Водичку нужно в анимации смотреть
Советую не использовать условия в шейдерах - они очень медленные.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.05.2014, 02:24
|
#116
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: 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;
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
02.05.2014, 09:32
|
#117
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Объясните пожалуйста басяцким языком что такое вектор Бинормали и Тангент?
|
(Offline)
|
|
02.05.2014, 11:50
|
#118
|
Бывалый
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений (для 866 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо tirarex за это полезное сообщение:
|
|
03.05.2014, 04:22
|
#119
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Нормаль обычно перпендикулярна поверхности.
Тангент перпендикулярен нормали и бинормали, и паралелен Y координате в текстурных координатах.
Бинормаль, перпендикулярен нормали и тангенту, и паралелен X координате в текстурных координатах.
Это нужно для того чтобы взять нормал карту (текстуру), извлечь из неё X и Y смещение, но оно же локально на текстуре, и далее используя нормаль, тангент и бинормаль, повернуть этот полученный вектор смещения из локального пространства в мировое.
Чтобы можно было уже далее использовать эти данные с другими, например вектором луча света от источника света, который тоже в мировом пространстве.
Любые операции над любыми данными, нужно производить в одном пространстве, это может быть локальное (local), мировое (world) или экранное (screen). Если какие-то данные в другом пространстве, то нужно их трансформировать в нужное, и для этого порой хватает только матрицы трансформации (local > world), проекционной матрицы (world > screen), а для текстурных, таких как нормал карта, нужны tbn (tanget, binormal, normal)
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
03.05.2014, 17:17
|
#120
|
Бывалый
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений (для 866 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Мой семпл 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;
}
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо tirarex за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:00.
|