forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   много шейдерного света (http://forum.boolean.name/showthread.php?t=17825)

tirarex 02.02.2013 17:48

много шейдерного света
 
Перешёл на ксорс изза наличия шейдеров
в примерах нашёл Bump Light + Bump Specular + FallOff
эффекты понравились но там в примере юзается всего 1 источник света
а что если мне требуется сделать их штук 50
а также возможность их смены яркости радиуса и скрытия
как такое провернуть с этим примером
надеюсь ктонибуть подскажет

jimon 02.02.2013 18:15

Ответ: много шейдерного света
 
тогда уж нужен deferred shading, вроде он в xors'е есть

tirarex 02.02.2013 18:32

Ответ: много шейдерного света
 
Только примеры с ним у меня выводят ошибку говоря об отсутствие такой функции хотя хорс самый последний с офф сайта


upd
может тогда кто нибудь скинет ксорс с рабочим deferred shading

FREE MAN 02.02.2013 22:48

Ответ: много шейдерного света
 
Цитата:

Сообщение от jimon (Сообщение 251476)
тогда уж нужен deferred shading, вроде он в xors'е есть

В Xors3d Деферед отрублен благодоря Кнайту и Сквиду:(

Цитата:

Сообщение от tirarex (Сообщение 251478)
Только примеры с ним у меня выводят ошибку говоря об отсутствие такой функции хотя хорс самый последний с офф сайта


upd
может тогда кто нибудь скинет ксорс с рабочим deferred shading

Можно заюзать Форвард рендыринг, но тогда придется сделать ограничение в
8-16 источников света в кадре, в зависимости от загруженности геометрии и логики.
Поковыряй шейдер с по пиксельным освещением.
Суть такова, что там есть переменные Light, Light_Color и т.д. дк вот
эта первый источник света, для второго указываешь уже Light2,Light_Color2 и в таком духе для каждого источника света.
Соответственно надо в вычислениях добавить еще туда второй и таким образом ты получишь куча света.

tirarex 02.02.2013 23:14

Ответ: много шейдерного света
 
Phyton спасибо но я только учусь шейдерам , я видел что ты уже делал такой шейдер , дак вот может скинеш его с примером использывания

FREE MAN 02.02.2013 23:25

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

tirarex 02.02.2013 23:38

Ответ: много шейдерного света
 
большое спасибо буду разбираться

tirarex 02.02.2013 23:53

Ответ: много шейдерного света
 
решил глянуть на исходник с 30 светильниками но шейдера Bump Lightmass_30 lights.fx в архиве нет

upd

почти всех шейдеров на свет нету
по адресу видно что шейдеры лежат в папки Materials а в архиве её нет

FREE MAN 03.02.2013 00:00

Ответ: много шейдерного света
 
Вот так надо было тебе скинуть, а я болда забыл тебе остальные файлы докинуть:)
Кстати там кнопочки 1,2,3 по нажимай, что бы выбрать нужную технику.

tirarex 03.02.2013 00:02

Ответ: много шейдерного света
 
еще есть вопрос : а можно glsl шейдеры конвертнуть в обычные для ксорса

FREE MAN 03.02.2013 00:06

Ответ: много шейдерного света
 
Нет

Mr_F_ 03.02.2013 00:07

Ответ: много шейдерного света
 
Да. glsl/hlsl мало отличий имеют. По-другому называются типы данных и некоторые функции. Разобраться не проблема, даже если ты не знаток шейдеров.

tirarex 03.02.2013 00:15

Ответ: много шейдерного света
 
Вложений: 1
интересный шейдер воды написанный на hlsl можете по подробней описать как сконвертировать и заюзать его

FREE MAN 03.02.2013 00:39

Ответ: много шейдерного света
 
Вот шейдер воды http://rghost.ru/43502204 под Xors3d, Юзай!

tirarex 03.02.2013 00:43

Ответ: много шейдерного света
 
спасибо , но у меня есть просто куча hlsl шейдеров также из скайрима и фар край 3 но я не совсем понимаю как их использывать

tirarex 03.02.2013 12:16

Ответ: много шейдерного света
 
Цитата:

Сообщение от Phyton (Сообщение 251531)
Вот шейдер воды http://rghost.ru/43502204 под Xors3d, Юзай!

немогу понять : ковыряю Bump Lightmas6

решил добавить еще 1 светильник

сам светилькник

;====================================
; LightSphere
Local tLightSpr91=xCreateSphere(1)
xEntityFX tLightSpr91,1
xPositionEntity tLightSpr91,130,-35,40
xEntityColor tLightSpr91,255,255,255
xScaleEntity tLightSpr91,2,2,2
xEntityCastShadows tLightSpr91,light0,0
xEntityReceiveShadows tLightSpr91,light0,0
xEntityCastShadows tLightSpr91,light01,0
xEntityReceiveShadows tLightSpr91,light01,0
;====================================

устонавливаю на модельку

xSetEffectVector tModel, "LightClr91",1.5,1.5,1.5
xSetEffectFloat tModel, "LightInt91",1
xSetEffectFloat tModel, "RngLight91",650
xSetEffectFloat tModel, "DotLight91",2

в цикле

xSetEffectVector tModel, "PosLight91",xEntityX(tLightSpr91),xEntityY(tLight Spr91),xEntityZ(tLightSpr91)

только когда в шейдере светильник прописал он заработал
но так не удобно

есть ли другой способ создания света ибо у меня колличество светильников динамично

FREE MAN 03.02.2013 12:38

Ответ: много шейдерного света
 
Есть

tirarex 03.02.2013 12:46

Ответ: много шейдерного света
 
и какой же

Mr_F_ 03.02.2013 13:44

Ответ: много шейдерного света
 
объяви в шейдере массив позиций лайтов.
сделай по ним цикл.

tirarex 03.02.2013 14:00

Ответ: много шейдерного света
 
Я только учусь шейдерам и пока плохо понимаю о чём ты говориш

можно пример этого массива и использывание его в цикле

Mr_F_ 03.02.2013 14:32

Ответ: много шейдерного света
 
float3 lightPos[100];
-----
for(int i=0;i<100;i++)
{
обрабатываешь lightPos[i]
}
передавать массивы векторов отдельной командой в ксорсе можно вроде

tirarex 03.02.2013 14:43

Ответ: много шейдерного света
 
тоесть так :
шейдер


float3 PosLight[100];
float RngLight[100];
float RDotLight[100];

const float3 LightClr[100]; // Light Color
const float LightInt[100]; // Light Intensity

цикл

for(int i=0;i<100;i++)
{



RngLight[i] = pow(saturate(1.0f-(distance(IN.pWorld,PosLight[i])/RngLight[i])),DotLight[i]);


cN = normalize(tex2D(TexNormal,IN.TexCoords)*2.0f-1.0f);

PosLight[i] = normalize(PosLight[i]-IN.pWorld);
nLight[i] = float3(dot(PosLight[i],IN.Tangent),
dot(PosLight[i],IN.Binormal),dot(PosLight[i],IN.Normal));

nLight[i] = pow(max(dot(cN,nLight[i]),0.0f),0.8f);

Color += cD.rgb*nLight[i]*LightClr[i]*LightInt[i]*RngLight[i];





}



только вот на счёт кода не понял

Mr_F_ 03.02.2013 15:06

Ответ: много шейдерного света
 
типа того, только не надо сто раз то текстуру нормалей читать.

tirarex 03.02.2013 15:12

Ответ: много шейдерного света
 
Цитата:

Сообщение от Mr_F_ (Сообщение 251595)
типа того, только не надо сто раз то текстуру нормалей читать.


тогда как сделать
и еще

как создать светильник в коде чтоб он прописался в этот массив , как настроить светильник в массиве , и как обновить его

всё это в коде

FREE MAN 03.02.2013 15:15

Ответ: много шейдерного света
 
Цитата:

Сообщение от tirarex (Сообщение 251596)
тогда как сделать
и еще

как создать светильник в коде чтоб он прописался в этот массив , как настроить светильник в массиве , и как обновить его

всё это в коде

Я же тебе скидывал пример NM_spotlight погляди его.

tirarex 03.02.2013 15:16

Ответ: много шейдерного света
 
посмотрю

кстати вот попробывал переписать шейдер
посмотрите

//##########################################
// mSL
//
// Bump Light
// with 3 Light Source Types
//
// Open Source, for Free Using
// Author: MoKa (Maxim Miheyev)
// Mail: [email protected]
// Visit: RubuX.net
//##########################################


//################## Varriables ##################
const float4x4 MatWorldViewProj;
const float4x4 MatWorld;

texture diffuseTexture : TEXTURE_0;
texture normalTexture : TEXTURE_1;
texture normalTexture_2 : TEXTURE_2;
// Light
const float3 AmbientClr; // Ambient Color
const float3 LightClr; // Light Color
const half LightInt; // Light Intensity

// Positions
float3 PosLight; // Light Position
float RngLight; // Light Range
float DotLight; // Light Soft


float3 PosLight[100];
float RngLight[100];
float RDotLight[100];

const float3 LightClr[100]; // Light Color
const float LightInt[100]; // Light Intensity



//Spot Light
const float3 LightClrspot; // Light Color
const half LightIntspot; // Light Intensity
// Positions
float3 PosLightspot; // Light Position
float RngLightspot; // Light Range
float DotLightspot; // Light Soft
float3 Lightdir; // world space direction
float LightspotInnerCone; // spot light inner cone (theta) angle
float LightspotOuterCone; // spot light outer cone (phi) angle



const float3 LightClrDirection; // Light Color
const half LightIntDirection; // Light Intensity

// Positions
float3 PosLightDirection; // Light Position
float RngLightDirection; // Light Range
float DotLightDirection; // Light Soft
// Other
static float3 Color;
static float4 cD;
static float3 cN;

static float3 nLight;

static float3 nLightDirection;



//################## Textures ##################
//const texture tDiffuse; // Diffuse Texture
sampler TexDiffuse=sampler_state {
Texture = <diffuseTexture>;
ADDRESSU = WRAP;
ADDRESSV = WRAP;
ADDRESSW = WRAP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
MIPFILTER = LINEAR;
};

//const texture tNormal; // NormalMap Texture
sampler TexNormal=sampler_state {
Texture = <normalTexture>;
ADDRESSU = WRAP;
ADDRESSV = WRAP;
ADDRESSW = WRAP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
MIPFILTER = LINEAR;
};
//const texture tNormal2; // NormalMap Texture2
sampler TexNormal2=sampler_state {
Texture = <normalTexture_2>;
ADDRESSU = WRAP;
ADDRESSV = WRAP;
ADDRESSW = WRAP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
MIPFILTER = LINEAR;
};

//################## Input VS ##################
struct sv_TBN_TC {
float4 Position : POSITION0;
float3 Normal : NORMAL;
float3 Tangent : TANGENT;
float3 Binormal : BINORMAL;
float2 TexCoords : TEXCOORD0;
};
//################## Output VS ##################
struct sp_PW_TBN_TC {
float4 Position : POSITION0;
float4 pWorld : TEXCOORD0;
float2 TexCoords : TEXCOORD1;
float3 Normal : TEXCOORD2;
float3 Tangent : TEXCOORD3;
float3 Binormal : TEXCOORD4;
};


//################## VS ##################
void vs_PW_TBN_TC( in sv_TBN_TC IN, out sp_PW_TBN_TC OUT ) {
OUT.Position = mul(IN.Position,MatWorldViewProj);
OUT.pWorld = mul(IN.Position,MatWorld);
OUT.Tangent = normalize(mul(IN.Tangent,MatWorld));
OUT.Binormal = normalize(mul(IN.Binormal,MatWorld));
OUT.Normal = normalize(mul(IN.Normal,MatWorld));
OUT.TexCoords = IN.TexCoords;
}

//################## PS ##################
float4 psDirectional( in sp_PW_TBN_TC IN ) : COLOR {
cD = tex2D(TexDiffuse,IN.TexCoords);
cN = normalize(tex2D(TexNormal,IN.TexCoords)*2.0f-1.0f);

PosLight = normalize(PosLight);
nLight = float3(dot(PosLight,IN.Tangent),
dot(PosLight,IN.Binormal),dot(PosLight,IN.Normal)) ;

nLight = pow(max(dot(cN,nLight),0.0f),0.8f);

Color = cD.rgb*AmbientClr+(cD*nLight*LightClr*LightInt);

return float4(Color,cD.a);
}
float4 psPoint( in sp_PW_TBN_TC IN ) : COLOR {
cD = tex2D(TexDiffuse,IN.TexCoords);
cN = normalize(tex2D(TexNormal,IN.TexCoords)*2.0f-1.0f);

PosLight = normalize(PosLight-IN.pWorld);
nLight = float3(dot(PosLight,IN.Tangent),
dot(PosLight,IN.Binormal),dot(PosLight,IN.Normal)) ;

nLight = pow(max(dot(cN,nLight),0.0f),0.8f);

Color = cD.rgb*AmbientClr+(cD*nLight*LightClr*LightInt);

return float4(Color,cD.a);
}
float4 psPointDistance( in sp_PW_TBN_TC IN ) : COLOR {
cD = tex2D(TexDiffuse,IN.TexCoords);
Color = cD.rgb*AmbientClr;










for(int i=0;i<100;i++)
{



RngLight[i] = pow(saturate(1.0f-(distance(IN.pWorld,PosLight[i])/RngLight[i])),DotLight[i]);


cN = normalize(tex2D(TexNormal,IN.TexCoords)*2.0f-1.0f);

PosLight[i] = normalize(PosLight[i]-IN.pWorld);
nLight[i] = float3(dot(PosLight[i],IN.Tangent),
dot(PosLight[i],IN.Binormal),dot(PosLight[i],IN.Normal));

nLight[i] = pow(max(dot(cN,nLight[i]),0.0f),0.8f);

Color += cD.rgb*nLight[i]*LightClr[i]*LightInt[i]*RngLight[i];





}
























//LIGHT_DIRECTION
PosLightDirection = normalize(PosLightDirection);
nLightDirection = float3(dot(PosLightDirection,IN.Tangent),
dot(PosLightDirection,IN.Binormal),dot(PosLightDir ection,IN.Normal));

nLightDirection = pow(max(dot(cN,nLightDirection),0.0f),0.8f);

Color += cD.rgb*cD*nLightDirection*LightClrDirection*LightI ntDirection;

return float4(Color,cD.a);
}

//################## Technique ##################
technique Directional {
pass p0 {
AlphaBlendEnable= false;
vertexshader = compile vs_3_0 vs_PW_TBN_TC();
pixelshader = compile ps_3_0 psDirectional();
}
}
technique Point {
pass p0 {
AlphaBlendEnable= false;
vertexshader = compile vs_3_0 vs_PW_TBN_TC();
pixelshader = compile ps_3_0 psPoint();
}
}
technique PointDistance {
pass p0 {
AlphaBlendEnable= false;
// AlphaTestEnable = 1;
//AlphaRef = 127;
//AlphaFunc = 5;
//AlphaBlendEnable = 0;
//CullMode = NONE;
vertexshader = compile vs_3_0 vs_PW_TBN_TC();
pixelshader = compile ps_3_0 psPointDistance();
}
}

Mr_F_ 03.02.2013 15:57

Ответ: много шейдерного света
 
Цитата:

тогда как сделать
ну блин, ПЕРЕД циклом один раз её прочитай

tirarex 03.02.2013 16:00

Ответ: много шейдерного света
 
cN = normalize(tex2D(TexNormal,IN.TexCoords)*2.0f-1.0f);

for(int i=0;i<100;i++)
{
RngLight[i] = pow(saturate(1.0f-(distance(IN.pWorld,PosLight[i])/RngLight[i])),DotLight[i]);
PosLight[i] = normalize(PosLight[i]-IN.pWorld);
nLight[i] = float3(dot(PosLight[i],IN.Tangent),
dot(PosLight[i],IN.Binormal),dot(PosLight[i],IN.Normal));
nLight[i] = pow(max(dot(cN,nLight[i]),0.0f),0.8f);
Color += cD.rgb*nLight[i]*LightClr[i]*LightInt[i]*RngLight[i];
}

так ??

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

Mr_F_ 03.02.2013 17:52

Ответ: много шейдерного света
 
ну это же логика, она что в шейдерах, что в блице одинаковая.

tirarex 03.02.2013 19:53

Ответ: много шейдерного света
 
в блитзе по проще


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

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