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=15605)

{pk}fire 20.06.2012 14:00

Ответ: Вопросы про Xors3D
 
Вложений: 6
Освещение в Xors3D:
Вложение 17053 Вложение 17054 Вложение 17055

Освещение lightmap в gile[s]:
Вложение 17056 Вложение 17057 Вложение 17058

Можно ли в Xors3D добиться такой картинки без использования шейдеров? Сделать тень по темнее и свет поярче?

moka 20.06.2012 14:06

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

{pk}fire 20.06.2012 14:23

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от MoKa (Сообщение 230821)
Можно. Только ты юзаешь шейдеры, значит там и внедряй настройки контраста света и теней.

Ну это понятно, что всемогущие шейдеры могут всё :) А как без них то?

4yBa4Ok 20.06.2012 16:52

Ответ: Вопросы про Xors3D
 
Можно и без шейдеров, поиграться с амбиентом и блюр сделать у теней

{pk}fire 20.06.2012 22:25

Ответ: Вопросы про Xors3D
 
Ну так амбиент либо всё ярко, либо всё темно, а надо чтобы тени потемнели, а свет посветлел:) Кстати с блуром примеров не нашёл, как его использовать? Вставлял xSetShadowsBlur, почему-то ничего не изменяется.
Ещё вопрос: можно ли и как(если можно) подсветить не освещенные полигоны? А то они слишком черные.

ANIK123 22.06.2012 04:25

Ответ: Вопросы про Xors3D
 
А изменить разрешение экрана можно прям по ходу выполнения программы?
UPD: или "удвоение пикселей" как в игре "fear" - любой "костыль" подойдет, главное это быстро изменять разрешение экрана
вот еще хочу спросить: есть возможность лепить больььше одной камеры - зачем? как между ними переключаться тогда?
PS: надо мне рендерить разные части сцены и с разными разрешениями, заранее благодарен за ответы :о)

Spy4433 14.07.2012 16:04

Ответ: Вопросы про Xors3D
 
Вложений: 1
Появился вопрос по шейдерам(возможно не сюда пишу)
как вообще в теории выглядит шейдер GI ?
желательно по пунктам как от начала и до конца


я не думал о 100% GI real-time но :) фейк GI в реалтайме я думаю возможно

Mr_F_ 14.07.2012 16:17

Ответ: Вопросы про Xors3D
 
Цитата:

как вообще в теории выглядит шейдер GI ?
нету такого шейдера, есть много разных подходов к реализации GI сегодня, гугли "realtime global illumination" (из последних новинок - voxel cone tracing), естественно реалтаймовое ги сегодня совсем неполное, лучших результатов ты можешь добиться только оффлайновым препросчётом (лайтмапы, лайтпробы).

в играх я пока совсем реалтайм ги не видел, есть технология enlighten, доступна в UE и Frostbite, но насколько мне известно, там не поддерживается смена источников освещения в рантайме (все равно что-то препросчитывается), в CE есть своё ги, но оно не особо эффектно выглядит имхо, в UE4 планируется ги не знаю по какой технологии (вероятно тот же enlighten?), остальные технологии существуют только в демках и доках и мало изведанны.

вот ещё такой фейк есть - reflective shadowmaps или как-то так, суть в том, что ты рендеришь с источника света, как для шадоумапы, но рендеришь целый маленький G-Buffer (цвет, позиция или глубина), потом в деферед шейдинге используешь этот буфер для позиционирования небольших поинт лайтов такого же цвета, какой снят в буфере, в результате имеешь один отскок света от поверхностей. но затенение при этом не учитывается (если ты не рендеришь шадоумап с каждого такого поинт лайта), т.е. у тебя рефлексы эти смогут насквозь просвечивать через другие поверхности.

moka 14.07.2012 17:28

Ответ: Вопросы про Xors3D
 
Глянь SSAO.

ANIK123 18.07.2012 04:56

Ответ: Вопросы про Xors3D
 
ммм...
в коде:
Код:

Handle sc = xLoadScript("sc.txt");
xExecuteScript(sc, "void www()");

в файлике:
Код:

void www ()
{
        xRenderWorld();
}

результ:

чяднт?

pozitiffcat 18.07.2012 09:19

Ответ: Вопросы про Xors3D
 
Написано же "No matching signatures to xRenderWorld" - что то типа не определена эта функция в скриптовом движке. Видимо на него давно забили и новые функции перестали в него добавлять

ANIK123 18.07.2012 20:16

Ответ: Вопросы про Xors3D
 
значит надо разбираться в Lua или Ангеле == потратить больше времени
печаль =(
Сегодня пришел малый парень дабы я помог ему разобраться в свежекупленном телефоне, оказалось очень тяжелу ему втолковать как им пользоваться
с одной стороны почувствовал себя прям каким-то созданием высшего уровня напротив него, а с другой пронзило глубокое чувство глупства, некого равенства с его кажущимися низкими мозго-вычеслительными способностями - Я ведь так же глуп в Lua!!1
не знаю к чему это все, поэтому и оффтоп гы)))

pozitiffcat 18.07.2012 21:30

Ответ: Вопросы про Xors3D
 
Пробуй ангел говорят неплохой скриптовый движок. Сам знаком с луа, мне нравится

ANIK123 20.07.2012 21:18

Ответ: Вопросы про Xors3D
 
на счет Lua: насколько я понял, в скриптах можно вызывать функции определенные в каком-то модуле - wtf? - как тогда обратится к функциям из главного *.exe ? вот захотел я вдруг сделать апокалипсис в мире по нажатию кнопи - создаю новый стейт (да?), запускаю скрипт (да?) с содержимым "УничтожитьМир(полностью);" - функция "воид УничтжитьМир(инт степень)" находится где то в исходниках главного .exe - можно так сделать?

ANIK123 21.07.2012 23:49

Ответ: Вопросы про Xors3D
 
ОК -_-
выбрал tolua++ (луабинд уже поздно использовать)
проблемка: построить tolua++, а то на выходе получаю только исполяемый файл, а нужно: хедер (есть), тот самый исполняемый файл (есть), и либа (*.lib)(нееееет!!1) - как получить этот последний ингредиент?

Spy4433 23.07.2012 21:53

Ответ: Вопросы про Xors3D
 
что то туплю ужасно

вообщем вздумалось мне копировать один surface из mesh1 в mesh2.
в теории:
создаю в mesh2 surface
далее в пробежаться по всем triangle первого surface (mesh1)
xTriangleVertex(surface1,x,y);

v1=xTriangleVertex(surf,n_tri,n_vert);
xVertexX(surf,v1);
.....
xAddTriangle(newsurf,v1,v2,v3);

xUpdateNormals(mesh2);


вроде как то так!? :)))
кому не сложно и не лень, и даже время есть - помогите :)

dsd 23.07.2012 22:17

Ответ: Вопросы про Xors3D
 
есть сюрфейс допустим surf1
считаем количество точек в поверхности.
int qvert=xCountVertices(surf1);

создаем меш и поверхность куда копировать будем
Handle mesh=xCreateMesh();
Handle surf=xCreateSurface(mesh);

for(int i=0;i<qvert;i++){
//копируем точку
int index=xAddVertex(surf,xVertexX(surf1,i),xVertexY(s urf1,i),xVertexZ(surf1,i),xVertexU(surf1,i),xVerte xV(surf1,i));
//копируем нормаль
xVertexNormal(surf,index,xVertexNX(surf1,i),xVerte xNY(surf1,i),xVertexNZ(surf1,i));
}
потом считаем количество треугольников в оригинальной поверхности, потом для каждого треугольника смотрим какие точки входят в треугольник и добавляем такой же в копируемую поверхность.
и как бы все будет, ну и можно еще и остальные параметры точек скопировать

зы хотя в сто раз проще скопировать меш и сделать xFreeSurface() для не нужных поверхностей

Spy4433 23.07.2012 22:25

Ответ: Вопросы про Xors3D
 
все уже разобрался )) накосячил с координатами вертексов :)

Владислав 28.11.2012 19:25

Ответ: Вопросы про Xors3D
 
Привет! Хочу поинтересоваться по поводу физики, встроенной в xors:

Возможно ли зафиксировать скорость обновления физики ? а то идет зависимость от фпс, а оно иногда падает. Логика игры завязана с дельтатаймингом, что можно придумать для физики ? может просто вызывать обновление каждые 16мс. ?

Spy4433 30.11.2012 21:49

Ответ: Вопросы про Xors3D
 
Вопрос про регдол.
когда нужно создавать регдол(вместе созданием плеера или во время смерти?)
-возможно ли создание регдола при создании плеера, а потом просто отключить просчет физики и джоинты(симуляцию)

попутный вопрос
имеет спрайт , как его развернуть(инвертировать) допустим слева на право ? не прибегая photoshop Gimp и т.д ) кодом ( в динамикЕ?! т.е в игровом процессе )

------------------------------------------------------------------------------------

Nex 01.12.2012 06:04

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от Spy4433 (Сообщение 245305)
имеет спрайт , как его развернуть допустим слева на право ? не пребегая photoshop Gimp итд ) кодом ( в динамики?! )

RotateSprite sprite,90?
Цитата:

в динамики
В какие динамики? :-D (динамике)

Владислав 04.12.2012 13:31

Ответ: Вопросы про Xors3D
 
предположу, что можно применить xEntityFx для двухстороннего текстурирования и просто повернуть спрайт на 180

Dream 05.12.2012 00:01

Ответ: Вопросы про Xors3D
 
Scale в -1 не прокатит интересно?

SBJoker 05.12.2012 00:54

Ответ: Вопросы про Xors3D
 
отрицательные скейлы это флип

jfkkk 18.12.2012 01:17

Ответ: Вопросы про Xors3D
 
Что значат значения передаваемые функцией xAnimTime?
Есть ли возможность узнать текущий фрэйм проигрываемой анимации?

Владислав 07.02.2013 00:28

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

Mr_F_ 07.02.2013 01:36

Ответ: Вопросы про Xors3D
 
в шейдере у семплера текстуры поставь
MAGFILTER = POINT;
MINFILTER = POINT;
MIPFILTER = NONE;

Владислав 07.02.2013 08:30

Ответ: Вопросы про Xors3D
 
Спасибо! Но без шейдеров возможно?

Platon 07.02.2013 09:42

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от Владислав (Сообщение 252014)
Спасибо! Но без шейдеров возможно?

смотри функцию xSetTextureFilter

Владислав 07.02.2013 22:33

Ответ: Вопросы про Xors3D
 
спасибо. Но я что-то не нашел в документации эту функцию. где ее применить и какие параметры передавать ?

FREE MAN 08.02.2013 00:33

Ответ: Вопросы про Xors3D
 
Раз!

xSetTextureFiltering (filtering)

Sets global texture filtering method.

During texture loading the method set by this command will be assigned to this texture. If you use shaders you can change filtering type in shader's code.

Parameters:
filter Filtering type. See 'Texture filtering types' for more information

Два!

xSetTextureFilter ( Texture , mode )

Sets texture filtering method.

Parameters:
texture Texture handle
mode Filtering type. See 'Texture filtering types' for more information

tirarex 08.02.2013 18:29

Ответ: Вопросы про Xors3D
 
я нашёл шейдер из срусиса
SSAO не подскажите как заюзать в ксорсе


////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Shader Source File
// Copyright (C), Crytek Studios, 2001-2007
// -------------------------------------------------------------------------
// File name: AmbientOcclusion.cfx
// Version: v1.00
// Created: 04/12/2006 by Vladimir Kajalin
// Description: Implementation of SSAO, TerrainAO (2.5 D maps), Fill lights
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////

#include "Common.cfi"
#include "ModificatorVT.cfi"

// Shader global descriptions
float Script : STANDARDSGLOBAL
<
string Script =
"NoPreview;"
"LocalConstants;"
"ShaderDrawType = Custom;"
"ShaderType = PostProcess;"
>;

// original depth target
sampler2D sceneDepthSampler = sampler_state
{
Texture = $ZTarget;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = POINT;
AddressU = Clamp;
AddressV = Clamp;
};

// downscaled depth target
sampler2D sceneDepthSamplerAO = sampler_state
{
Texture = $ZTargetScaled;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = POINT;
AddressU = Clamp;
AddressV = Clamp;
};

sampler2D depthTargetSampler : register(s0);
sampler2D TerrainInfoSampler0 : register(s1);
sampler2D TerrainInfoSampler1 : register(s2);

#include "ShadowCommon.cfi"

//================================================== =========================

float4 AOSectorRange;
float4 TerrainAOInfo;
float4 FillLightPos;
float4 FillLightColor;
float4 SSAO_params
float4x4 CompMatrix : PI_Composite;

/////////////////////////////
// structs

struct pixout_cl
{
float4 Color : COLOR0;
};

struct vert2fragSSAO
{
float4 HPosition : POSITION;
float4 ScreenTC : TEXCOORD0;
float3 WS_ViewVect: TEXCOORD1;
};

struct app2vertShadow
{
IN_P
IN_TBASE
float3 viewDir : TEXCOORD1;
};

vert2fragSSAO Deferred_SSAO_Pass_VS(app2vertShadow IN)
{
vert2fragSSAO OUT;
#ifndef OPENGL
OUT = (vert2fragSSAO)0;
#endif

OUT.HPosition = mul(CompMatrix, IN.Position);
OUT.ScreenTC.xy = IN.baseTC.xy;
OUT.ScreenTC.zw = IN.baseTC.xy*g_VS_ScreenSize.xy/4;
OUT.WS_ViewVect = IN.viewDir;

return OUT;
}

///////////////// shadows pixel shader //////////////////
/*pixout_cl AmbientShadowMaskPS(vert2fragShadowNew IN)
{
pixout_cl OUT;

float SceneDepth = tex2D( sceneDepthSampler, IN.ScreenTC.xy ).r;

float2 randTC;
randTC.xy = IN.ScreenTC.xy*256;
float3 rotSample = tex2D(sRotSampler AO, randTC+float2(SceneDepth,SceneDepth)).rgb;
rotSample = 2.0 * rotSample - 1.0;
rotSample.xyz = normalize(rotSample.xyz);

// define kernel
float scale = 0.02;
float3 irreg_kernel[8] =
{
float3(0.527837, -0.085868 ,0.527837) * scale,
float3(-0.040088, 0.536087, -0.040088) * scale,
float3(-0.670445, -0.179949, -0.670445) * scale,
float3(-0.419418, -0.616039, -0.419418) * scale,
float3(0.440453, -0.639399, 0.440453) * scale,
float3(-0.757088, 0.349334, -0.757088) * scale,
float3(0.574619, 0.685879,0.574619) * scale,
float3(0.03851, -0.939059, 0.03851) * scale
};

// get rotatiojn matrix
float3x3 rotMat;
GetRotationV0Terrain(rotSample, rotMat);

float fDistScale = 0.5 / saturate(SceneDepth);

// sample
float fSkyAccess = 0;
for(float i=0; i<8; i++)
{
float3 irregSample = mul(irreg_kernel, rotMat);
float2 ScreenTC2 = IN.ScreenTC.xy + irregSample.xy * fDistScale;
float SceneDepth2 = tex2D( sceneDepthSampler, ScreenTC2 ).r;
float fRange = abs(SceneDepth2-SceneDepth)*12;
fSkyAccess += lerp(saturate(SceneDepth2>(SceneDepth+irregSample. z)), .75, saturate(fRange));
}

OUT.Color = saturate(fSkyAccess*0.25);
return OUT;
}*/

sampler2D sRotSampler4x4_16 = sampler_state
{
Texture = $16PointsOnSphere;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};
/*
sampler2D sRotSampler4x4 = sampler_state
{
Texture = Textures/Defaults/noise4x4.dds;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};
*/
// vPlane should be normalized
// the returned vector has the same length as vDir
float3 mirror( float3 vDir, float3 vPlane )
{
return vDir - 2 * vPlane * dot(vPlane,vDir);
}
/*
float GetVarianceAO(sampler2D depthMap, float3 p)
{
float2 moments = tex2D( depthMap, p.xy ).xy;

// Variance shadow mapping
float M = moments.r; //mean

//TD invesigate: we calculate variance in non-shifted by 0.5 space here
//is it correct
float E_x2 = moments.g;
float Ex_2 = M * M;
float variance = (E_x2 - Ex_2);//decrease range of variance to increase precision for 16-bit formats

float m_d = M - p.z;
float p_max = variance / (variance + m_d * m_d);

// Standard shadow map comparison
float lit_factor = m_d > -0.001;

//select properly shadow region because of one-tailed version of inequality
float shadow = max(lit_factor, p_max);
return shadow;
}
*/
/*

sampler2D SSAO_Sampler_0 : register(s4);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_1 : register(s5);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_2 : register(s6);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_3 : register(s7);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_4 : register(s8);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_5 : register(s9);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_6 : register(s10);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_7 : register(s11);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

pixout_cl Deferred_SSAO_Pass_PS_DepthBlurBased(vert2fragSSAO IN)
{
pixout_cl OUT;

// float3 p = float3( IN.ScreenTC.xy, tex2D( sceneDepthSampler, IN.ScreenTC.xy ).r );
//OUT.Color = GetVarianceAO( SSAO_Sampler_3, p );

float fSceneDepth = tex2D( sceneDepthSampler, IN.ScreenTC.xy ).r;

float4 arrSceneDepthBlur[8];
arrSceneDepthBlur[0] = tex2D( SSAO_Sampler_0, IN.ScreenTC.xy );
arrSceneDepthBlur[1] = tex2D( SSAO_Sampler_1, IN.ScreenTC.xy );
arrSceneDepthBlur[2] = tex2D( SSAO_Sampler_2, IN.ScreenTC.xy );
arrSceneDepthBlur[3] = tex2D( SSAO_Sampler_3, IN.ScreenTC.xy );
arrSceneDepthBlur[4] = tex2D( SSAO_Sampler_4, IN.ScreenTC.xy );
arrSceneDepthBlur[5] = tex2D( SSAO_Sampler_5, IN.ScreenTC.xy );
arrSceneDepthBlur[6] = tex2D( SSAO_Sampler_6, IN.ScreenTC.xy );
arrSceneDepthBlur[7] = tex2D( SSAO_Sampler_7, IN.ScreenTC.xy );

OUT.Color = 0;

int nSamples = 3;
int nStart = 0;

for(int t=nStart; t<nStart+nSamples; t++)
{
float2 blurredDepth = arrSceneDepthBlur[t].xy;
float fFix = saturate((fSceneDepth-blurredDepth.g-0.01)*(146.f / (1.f+t*2.f)));
float fRes = 0;
fRes += fFix;
fRes += saturate(1-(fSceneDepth*0.999f - blurredDepth.r)*400.f*saturate(1.f-blurredDepth.g));
fRes = saturate(fRes);

OUT.Color += fRes/nSamples;
}

return OUT;
}

technique Deferred_SSAO_Pass_DepthBlurBased
{
//Shadow pass
pass p0
{
VertexShader = compile vs_2_0 Deferred_SSAO_Pass_VS();

ZEnable = false;
ZWriteEnable = false;
CullMode = None;

PixelShader = compile ps_2_x Deferred_SSAO_Pass_PS_DepthBlurBased();
}
}
*/

/* SSIL test by Vlad
pixout_cl Deferred_SSIL_Pass_PS(vert2fragSSAO IN)
{
pixout_cl OUT;

// define kernelw
const half step = 1.4;//(1.f - 1.f/8.f);
float n = .1;
const half fScale = 0.025f/2;

const int nCount = 16;

const half3 arrKernel[nCount] =
{
float3(0.527837, -0.085868 ,0.527837) *fScale*(n*=step),
float3(-0.040088, 0.536087, -0.040088) *fScale*(n*=step),
float3(-0.670445, -0.179949, -0.670445) *fScale*(n*=step),
float3(-0.419418, -0.616039, -0.419418) *fScale*(n*=step),
float3(0.440453, -0.639399, 0.440453) *fScale*(n*=step),
float3(-0.757088, 0.349334, -0.757088) *fScale*(n*=step),
float3(0.574619, 0.685879,0.574619) *fScale*(n*=step),
float3(0.03851, -0.939059, 0.03851) *fScale*(n*=step),
float3(0.527837, -0.085868 ,0.527837) *fScale*(n*=step),
float3(-0.040088, 0.536087, -0.040088) *fScale*(n*=step),
float3(-0.670445, -0.179949, -0.670445) *fScale*(n*=step),
float3(-0.419418, -0.616039, -0.419418) *fScale*(n*=step),
float3(0.440453, -0.639399, 0.440453) *fScale*(n*=step),
float3(-0.757088, 0.349334, -0.757088) *fScale*(n*=step),
float3(0.574619, 0.685879,0.574619) *fScale*(n*=step),
float3(0.03851, -0.939059, 0.03851) *fScale*(n*=step),
};

// create random rot matrix
half3 rotSample = tex2D(sRotSampler4x4_16, IN.ScreenTC.zw).rgb;
rotSample = normalize((2.0 * rotSample - 1.0));

// read actual RGB and depth
float4 vRootNNND = tex2D( sceneDepthSampler, IN.ScreenTC.xy ).yzwx;
half fSceneDepth = vRootNNND.w;

// get root pixel normal
// float fNormScale = 256; // same as in TexToTexPS
//half3 WSPos = float3(IN.ScreenTC.xy, fSceneDepth*fNormScale);
float3 vNorm = vRootNNND.xyz;//normalize(cross(ddx(WSPos),ddy(WSPos)));

// range/scale conversions
half fSceneDepthM = fSceneDepth * PS_NearFarClipDist.y;
half3 vSampleScale = SSAO_params.zzw*2;
float fDepthRangeScale = PS_NearFarClipDist.y / vSampleScale.z * 0.85f;
vSampleScale.xy *= 1.0f / fSceneDepthM;
vSampleScale.z *= 2.0f / PS_NearFarClipDist.y;

float fDepthTestSoftness = 8.f/vSampleScale.z;

half4 vIndLight = 0.f;

float3 vRGB0 = tex2D( sceneBackBufferSampler, IN.ScreenTC.xy );

for(int i=0; i<nCount; i++)
{
half3 vIrrSample = mirror(arrKernel, rotSample) * vSampleScale;

float2 tc = IN.ScreenTC.xy + vIrrSample.xy;

float3 vRGB = tex2D( sceneBackBufferSampler, tc );

float4 vNNND = tex2D( sceneDepthSampler, tc ).yzwx;

vNNND.a += vIrrSample.z;

float fDepthTest = 1-saturate(0.75*abs(vNNND.a-fSceneDepth)*fDepthTestSoftness + 0.25*(vNNND.a-fSceneDepth)*fDepthTestSoftness);

half fDistance = fSceneDepth - vNNND.a;

float fDot = saturate((dot(-vNorm,vNNND.xyz)+1.0f));

float fDistanceScaled = fDistance * fDepthRangeScale * 2;

float fRangeIsValid = 1;//1-saturate( abs(fDistanceScaled) );

{
float fSceneDepth2 = vNNND.a;
float fRangeIsInvalid = saturate( abs(fSceneDepth-fSceneDepth2) * fDepthRangeScale );
fRangeIsInvalid = (saturate( abs(fDistanceScaled) ) + saturate( fDistanceScaled ))/2;
vIndLight.a += lerp(saturate((fSceneDepth2-fSceneDepth)*fDepthTestSoftness*16), 1, fRangeIsInvalid);
}

// vIndLight.rgb += lerp(1.f,vRGB*2-1,sqrt(fRangeIsValid*fDepthTest*fDot));
vIndLight.rgb += lerp(1,vRGB-0.33,sqrt(fDepthTest*fDot*4));
}

vIndLight.rgb = 3*(vIndLight.rgb - (vIndLight.rgb.x+vIndLight.rgb.y+vIndLight.rgb.z)* 0.3333f)
+ (vIndLight.rgb.x+vIndLight.rgb.y+vIndLight.rgb.z)* 0.3333f;

vIndLight = vIndLight / nCount;

OUT.Color.rgb = lerp(saturate(vIndLight.xyz), 1, saturate(vIndLight.a*6-2));
// OUT.Color.rgb = saturate(vIndLight.a*4-1.3);
// OUT.Color.rgb = saturate(vIndLight.rgb);
OUT.Color.a = 1;

return OUT;
}*/

pixout_cl Deferred_SSAO_Pass_PS(vert2fragSSAO IN)
{
pixout_cl OUT;

// define kernel
const half step = 1.f - 1.f/8.f;
half n = 0;
const half fScale = 0.025f;
const half3 arrKernel[8] =
{
normalize(half3( 1, 1, 1))*fScale*(n+=step),
normalize(half3(-1,-1,-1))*fScale*(n+=step),
normalize(half3(-1,-1, 1))*fScale*(n+=step),
normalize(half3(-1, 1,-1))*fScale*(n+=step),
normalize(half3(-1, 1 ,1))*fScale*(n+=step),
normalize(half3( 1,-1,-1))*fScale*(n+=step),
normalize(half3( 1,-1, 1))*fScale*(n+=step),
normalize(half3( 1, 1,-1))*fScale*(n+=step),
};

// create random rot matrix
half3 rotSample = tex2D(sRotSampler4x4_16, IN.ScreenTC.zw).rgb;
rotSample = (2.0 * rotSample - 1.0);

half fSceneDepth = tex2D( sceneDepthSampler, IN.ScreenTC.xy ).r;

// range conversions
half fSceneDepthM = fSceneDepth * PS_NearFarClipDist.y;

half3 vSampleScale = SSAO_params.zzw
* saturate(fSceneDepthM / 5.3f) // make area smaller if distance less than 5 meters
* (1.f + fSceneDepthM / 8.f ); // make area bigger if distance more than 32 meters

float fDepthRangeScale = PS_NearFarClipDist.y / vSampleScale.z * 0.85f;

// convert from meters into SS units
vSampleScale.xy *= 1.0f / fSceneDepthM;
vSampleScale.z *= 2.0f / PS_NearFarClipDist.y;

float fDepthTestSoftness = 64.f/vSampleScale.z;

// sample
half4 vSkyAccess = 0.f;
half4 arrSceneDepth2[2];
half3 vIrrSample;
half4 vDistance;
float4 fRangeIsInvalid;

const half bHQ = (GetShaderQuality()==QUALITY_HIGH);

float fHQScale = 0.5f;

for(int i=0; i<2; i++)
{
vIrrSample = mirror(arrKernel[i*4+0], rotSample) * vSampleScale;
arrSceneDepth2[0].x = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
if (bHQ)
{
vIrrSample.xyz *= fHQScale;
arrSceneDepth2[1].x = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
}

vIrrSample = mirror(arrKernel[i*4+1], rotSample) * vSampleScale;
arrSceneDepth2[0].y = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
if (bHQ)
{
vIrrSample.xyz *= fHQScale;
arrSceneDepth2[1].y = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
}

vIrrSample = mirror(arrKernel[i*4+2], rotSample) * vSampleScale;
arrSceneDepth2[0].z = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
if (bHQ)
{
vIrrSample.xyz *= fHQScale;
arrSceneDepth2[1].z = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
}

vIrrSample = mirror(arrKernel[i*4+3], rotSample) * vSampleScale;
arrSceneDepth2[0].w = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
if (bHQ)
{
vIrrSample.xyz *= fHQScale;
arrSceneDepth2[1].w = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
}

float fDefVal = 0.55f;

for(int s=0; s<(bHQ ? 2 : 1); s++)
{
vDistance = fSceneDepth - arrSceneDepth2;
float4 vDistanceScaled = vDistance * fDepthRangeScale;
fRangeIsInvalid = (saturate( abs(vDistanceScaled) ) + saturate( vDistanceScaled ))/2;
vSkyAccess += lerp(saturate((-vDistance)*fDepthTestSoftness), fDefVal, fRangeIsInvalid);
}
}

OUT.Color = dot( vSkyAccess, (bHQ ? 1/16.0f : 1/8.0f)*2.0 ) - SSAO_params.y; // 0.075f
OUT.Color = saturate(lerp( 0.9f, OUT.Color, SSAO_params.x ));

return OUT;
}

/*pixout_cl Deferred_SSAO_Pass_PS_Ref(vert2fragSSAO IN)
{
pixout_cl OUT;

// define kernel
const half step = 1.f - 1.f/8.f;
half n = 0;
const half fScale = 0.025f;
const half3 arrKernel[8] =
{
normalize(half3( 1, 1, 1))*fScale*(n+=step),
normalize(half3(-1,-1,-1))*fScale*(n+=step),
normalize(half3(-1,-1, 1))*fScale*(n+=step),
normalize(half3(-1, 1,-1))*fScale*(n+=step),
normalize(half3(-1, 1 ,1))*fScale*(n+=step),
normalize(half3( 1,-1,-1))*fScale*(n+=step),
normalize(half3( 1,-1, 1))*fScale*(n+=step),
normalize(half3( 1, 1,-1))*fScale*(n+=step),
};

// create random rot matrix
half3 rotSample = tex2D(sRotSampler4x4_16, IN.ScreenTC.zw).rgb;
rotSample = normalize(2.0 * rotSample - 1.0);
half3x3 rotMat;
GetRotationV0(rotSample, rotMat);

half fSceneDepth = tex2D( sceneDepthSampler, IN.ScreenTC.xy ).r;

// range conversions
half fSceneDepthM = fSceneDepth * PS_NearFarClipDist.y;

// define sampling area size
half3 vSampleScale = SSAO_params.zzw
* saturate(fSceneDepthM / 5.3f) // make area smaller if distance less than 5 meters
* (1.f + fSceneDepthM / 8.f ); // make area bigger if distance more than 32 meters

float fDepthRangeScale = PS_NearFarClipDist.y / vSampleScale.z * 0.75f;

// convert from meters into SS units
vSampleScale.xy *= 1.0f / fSceneDepthM;
vSampleScale.z *= 2.0f / PS_NearFarClipDist.y;

// sample
half fSkyAccess = 0.f;
float fDepthTestSoftness = 32.f/vSampleScale.z;
half3 irregSample;
half fSceneDepth2;
float fRangeIsInvalid;
for(int i=0; i<8; i++)
{
irregSample = mul(arrKernel, rotMat) * vSampleScale;
fSceneDepth2 = tex2D(sceneDepthSamplerAO, IN.ScreenTC.xy + irregSample.xy ).r-irregSample.z;
fRangeIsInvalid = saturate( abs(fSceneDepth-fSceneDepth2) * fDepthRangeScale );
fSkyAccess += lerp(saturate((fSceneDepth2-fSceneDepth)*fDepthTestSoftness), 0.6f, fRangeIsInvalid);
}

OUT.Color = saturate(1.3f+((SSAO_params.x-1.f)*0.35)-pow(1.f-fSkyAccess/7.0f,3)*2.5f*SSAO_params.x);

return OUT;
}*/

//////////////////////////////// technique ////////////////

pixout_cl Deferred_FillLight_Pass_PS(vert2fragSSAO IN)
{
pixout_cl OUT;

// reconstruct WS position
half SceneDepth = tex2D( depthTargetSampler, IN.ScreenTC.xy ).r;
half3 WSPos = vfViewPos.xyz + IN.WS_ViewVect * SceneDepth;

// simple lighting
half3 vLightDir = FillLightPos.xyz-WSPos.xyz;
OUT.Color = saturate(1.f-length(vLightDir) / FillLightPos.w);

#if %USE_SM30
float NdotL = saturate(dot(normalize(vLightDir),normalize(cross( ddy(WSPos),ddx(WSPos)))));
OUT.Color *= (NdotL*0.6666f+0.3333f);
#else
OUT.Color = pow(OUT.Color,2);
#endif

// range scale
OUT.Color *= FillLightColor.x / 8.f;

return OUT;
}

pixout_cl Deferred_TerrainAO_Pass_PS(vert2fragSSAO IN)
{
pixout_cl OUT;

// reconstruct pixel world position
half SceneDepth = tex2D( depthTargetSampler, IN.ScreenTC.xy ).r;
float3 vWSPos = vfViewPos.xyz + IN.WS_ViewVect * SceneDepth;

// find terrain texture coordinates
float2 texCoord = float2((vWSPos.y-AOSectorRange.y), (vWSPos.x-AOSectorRange.x)) * TerrainAOInfo.w;

// get terrain and vegetation elevations
half4 dataS0 = tex2D( TerrainInfoSampler0, texCoord );
half4 dataS1 = tex2D( TerrainInfoSampler1, texCoord );
half fTerrainZ = dataS1.a*(AOSectorRange.w-AOSectorRange.z)+AOSectorRange.z;
half fVegetZMax = fTerrainZ + dataS1.g*32.f;

// get initial sky amount, TODO: try pow() here
OUT.Color = saturate(1.f-TerrainAOInfo.g*(fVegetZMax-vWSPos.z));

// scale based on sky amount precomputed for terrain
half fTerrainSkyAmount = dataS0.a * saturate(1.f - (fTerrainZ-vWSPos.z)*0.025f);
OUT.Color = lerp(OUT.Color,1.f,fTerrainSkyAmount);

// lerp into pure terrain sky amount near the ground
half fHeightFactor = saturate((vWSPos.z-fTerrainZ)*0.5f);
OUT.Color = lerp(fTerrainSkyAmount,OUT.Color,fHeightFactor);

// apply sky brightening and fade on distance
half fDistAtt = saturate(pow(SceneDepth*PS_NearFarClipDist.y/1024.f,3));
OUT.Color = lerp(1.f, OUT.Color, (1.f - TerrainAOInfo.r)*(1.f - fDistAtt));

return OUT;
}

technique Deferred_SSAO_Pass
{
//Shadow pass
pass p0
{
VertexShader = compile vs_2_0 Deferred_SSAO_Pass_VS();

ZEnable = false;
ZWriteEnable = false;
CullMode = None;

PixelShader = compile ps_2_x Deferred_SSAO_Pass_PS();
}
}

technique Deferred_TerrainAO_Pass
{
//Shadow pass
pass p0
{
VertexShader = compile vs_2_0 Deferred_SSAO_Pass_VS();

ZEnable = false;
ZWriteEnable = false;
CullMode = None;

PixelShader = compile ps_2_0 Deferred_TerrainAO_Pass_PS();
}
}

technique Deferred_FillLight_Pass
{
//Shadow pass
pass p0
{
VertexShader = compile vs_2_0 Deferred_SSAO_Pass_VS();

ZEnable = false;
ZWriteEnable = false;
CullMode = None;

#if %USE_SM30
PixelShader = compile ps_3_0 Deferred_FillLight_Pass_PS();
#else
PixelShader = compile ps_2_x Deferred_FillLight_Pass_PS();
#endif

}
}

FREE MAN 08.02.2013 21:56

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от tirarex (Сообщение 252140)
я нашёл шейдер из срусиса
SSAO не подскажите как заюзать в ксорсе


////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Shader Source File
// Copyright (C), Crytek Studios, 2001-2007
// -------------------------------------------------------------------------
// File name: AmbientOcclusion.cfx
// Version: v1.00
// Created: 04/12/2006 by Vladimir Kajalin
// Description: Implementation of SSAO, TerrainAO (2.5 D maps), Fill lights
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////

#include "Common.cfi"
#include "ModificatorVT.cfi"

// Shader global descriptions
float Script : STANDARDSGLOBAL
<
string Script =
"NoPreview;"
"LocalConstants;"
"ShaderDrawType = Custom;"
"ShaderType = PostProcess;"
>;

// original depth target
sampler2D sceneDepthSampler = sampler_state
{
Texture = $ZTarget;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = POINT;
AddressU = Clamp;
AddressV = Clamp;
};

// downscaled depth target
sampler2D sceneDepthSamplerAO = sampler_state
{
Texture = $ZTargetScaled;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = POINT;
AddressU = Clamp;
AddressV = Clamp;
};

sampler2D depthTargetSampler : register(s0);
sampler2D TerrainInfoSampler0 : register(s1);
sampler2D TerrainInfoSampler1 : register(s2);

#include "ShadowCommon.cfi"

//================================================== =========================

float4 AOSectorRange;
float4 TerrainAOInfo;
float4 FillLightPos;
float4 FillLightColor;
float4 SSAO_params
float4x4 CompMatrix : PI_Composite;

/////////////////////////////
// structs

struct pixout_cl
{
float4 Color : COLOR0;
};

struct vert2fragSSAO
{
float4 HPosition : POSITION;
float4 ScreenTC : TEXCOORD0;
float3 WS_ViewVect: TEXCOORD1;
};

struct app2vertShadow
{
IN_P
IN_TBASE
float3 viewDir : TEXCOORD1;
};

vert2fragSSAO Deferred_SSAO_Pass_VS(app2vertShadow IN)
{
vert2fragSSAO OUT;
#ifndef OPENGL
OUT = (vert2fragSSAO)0;
#endif

OUT.HPosition = mul(CompMatrix, IN.Position);
OUT.ScreenTC.xy = IN.baseTC.xy;
OUT.ScreenTC.zw = IN.baseTC.xy*g_VS_ScreenSize.xy/4;
OUT.WS_ViewVect = IN.viewDir;

return OUT;
}

///////////////// shadows pixel shader //////////////////
/*pixout_cl AmbientShadowMaskPS(vert2fragShadowNew IN)
{
pixout_cl OUT;

float SceneDepth = tex2D( sceneDepthSampler, IN.ScreenTC.xy ).r;

float2 randTC;
randTC.xy = IN.ScreenTC.xy*256;
float3 rotSample = tex2D(sRotSampler AO, randTC+float2(SceneDepth,SceneDepth)).rgb;
rotSample = 2.0 * rotSample - 1.0;
rotSample.xyz = normalize(rotSample.xyz);

// define kernel
float scale = 0.02;
float3 irreg_kernel[8] =
{
float3(0.527837, -0.085868 ,0.527837) * scale,
float3(-0.040088, 0.536087, -0.040088) * scale,
float3(-0.670445, -0.179949, -0.670445) * scale,
float3(-0.419418, -0.616039, -0.419418) * scale,
float3(0.440453, -0.639399, 0.440453) * scale,
float3(-0.757088, 0.349334, -0.757088) * scale,
float3(0.574619, 0.685879,0.574619) * scale,
float3(0.03851, -0.939059, 0.03851) * scale
};

// get rotatiojn matrix
float3x3 rotMat;
GetRotationV0Terrain(rotSample, rotMat);

float fDistScale = 0.5 / saturate(SceneDepth);

// sample
float fSkyAccess = 0;
for(float i=0; i<8; i++)
{
float3 irregSample = mul(irreg_kernel, rotMat);
float2 ScreenTC2 = IN.ScreenTC.xy + irregSample.xy * fDistScale;
float SceneDepth2 = tex2D( sceneDepthSampler, ScreenTC2 ).r;
float fRange = abs(SceneDepth2-SceneDepth)*12;
fSkyAccess += lerp(saturate(SceneDepth2>(SceneDepth+irregSample. z)), .75, saturate(fRange));
}

OUT.Color = saturate(fSkyAccess*0.25);
return OUT;
}*/

sampler2D sRotSampler4x4_16 = sampler_state
{
Texture = $16PointsOnSphere;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};
/*
sampler2D sRotSampler4x4 = sampler_state
{
Texture = Textures/Defaults/noise4x4.dds;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};
*/
// vPlane should be normalized
// the returned vector has the same length as vDir
float3 mirror( float3 vDir, float3 vPlane )
{
return vDir - 2 * vPlane * dot(vPlane,vDir);
}
/*
float GetVarianceAO(sampler2D depthMap, float3 p)
{
float2 moments = tex2D( depthMap, p.xy ).xy;

// Variance shadow mapping
float M = moments.r; //mean

//TD invesigate: we calculate variance in non-shifted by 0.5 space here
//is it correct
float E_x2 = moments.g;
float Ex_2 = M * M;
float variance = (E_x2 - Ex_2);//decrease range of variance to increase precision for 16-bit formats

float m_d = M - p.z;
float p_max = variance / (variance + m_d * m_d);

// Standard shadow map comparison
float lit_factor = m_d > -0.001;

//select properly shadow region because of one-tailed version of inequality
float shadow = max(lit_factor, p_max);
return shadow;
}
*/
/*

sampler2D SSAO_Sampler_0 : register(s4);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_1 : register(s5);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_2 : register(s6);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_3 : register(s7);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_4 : register(s8);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_5 : register(s9);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_6 : register(s10);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

sampler2D SSAO_Sampler_7 : register(s11);
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
};

pixout_cl Deferred_SSAO_Pass_PS_DepthBlurBased(vert2fragSSAO IN)
{
pixout_cl OUT;

// float3 p = float3( IN.ScreenTC.xy, tex2D( sceneDepthSampler, IN.ScreenTC.xy ).r );
//OUT.Color = GetVarianceAO( SSAO_Sampler_3, p );

float fSceneDepth = tex2D( sceneDepthSampler, IN.ScreenTC.xy ).r;

float4 arrSceneDepthBlur[8];
arrSceneDepthBlur[0] = tex2D( SSAO_Sampler_0, IN.ScreenTC.xy );
arrSceneDepthBlur[1] = tex2D( SSAO_Sampler_1, IN.ScreenTC.xy );
arrSceneDepthBlur[2] = tex2D( SSAO_Sampler_2, IN.ScreenTC.xy );
arrSceneDepthBlur[3] = tex2D( SSAO_Sampler_3, IN.ScreenTC.xy );
arrSceneDepthBlur[4] = tex2D( SSAO_Sampler_4, IN.ScreenTC.xy );
arrSceneDepthBlur[5] = tex2D( SSAO_Sampler_5, IN.ScreenTC.xy );
arrSceneDepthBlur[6] = tex2D( SSAO_Sampler_6, IN.ScreenTC.xy );
arrSceneDepthBlur[7] = tex2D( SSAO_Sampler_7, IN.ScreenTC.xy );

OUT.Color = 0;

int nSamples = 3;
int nStart = 0;

for(int t=nStart; t<nStart+nSamples; t++)
{
float2 blurredDepth = arrSceneDepthBlur[t].xy;
float fFix = saturate((fSceneDepth-blurredDepth.g-0.01)*(146.f / (1.f+t*2.f)));
float fRes = 0;
fRes += fFix;
fRes += saturate(1-(fSceneDepth*0.999f - blurredDepth.r)*400.f*saturate(1.f-blurredDepth.g));
fRes = saturate(fRes);

OUT.Color += fRes/nSamples;
}

return OUT;
}

technique Deferred_SSAO_Pass_DepthBlurBased
{
//Shadow pass
pass p0
{
VertexShader = compile vs_2_0 Deferred_SSAO_Pass_VS();

ZEnable = false;
ZWriteEnable = false;
CullMode = None;

PixelShader = compile ps_2_x Deferred_SSAO_Pass_PS_DepthBlurBased();
}
}
*/

/* SSIL test by Vlad
pixout_cl Deferred_SSIL_Pass_PS(vert2fragSSAO IN)
{
pixout_cl OUT;

// define kernelw
const half step = 1.4;//(1.f - 1.f/8.f);
float n = .1;
const half fScale = 0.025f/2;

const int nCount = 16;

const half3 arrKernel[nCount] =
{
float3(0.527837, -0.085868 ,0.527837) *fScale*(n*=step),
float3(-0.040088, 0.536087, -0.040088) *fScale*(n*=step),
float3(-0.670445, -0.179949, -0.670445) *fScale*(n*=step),
float3(-0.419418, -0.616039, -0.419418) *fScale*(n*=step),
float3(0.440453, -0.639399, 0.440453) *fScale*(n*=step),
float3(-0.757088, 0.349334, -0.757088) *fScale*(n*=step),
float3(0.574619, 0.685879,0.574619) *fScale*(n*=step),
float3(0.03851, -0.939059, 0.03851) *fScale*(n*=step),
float3(0.527837, -0.085868 ,0.527837) *fScale*(n*=step),
float3(-0.040088, 0.536087, -0.040088) *fScale*(n*=step),
float3(-0.670445, -0.179949, -0.670445) *fScale*(n*=step),
float3(-0.419418, -0.616039, -0.419418) *fScale*(n*=step),
float3(0.440453, -0.639399, 0.440453) *fScale*(n*=step),
float3(-0.757088, 0.349334, -0.757088) *fScale*(n*=step),
float3(0.574619, 0.685879,0.574619) *fScale*(n*=step),
float3(0.03851, -0.939059, 0.03851) *fScale*(n*=step),
};

// create random rot matrix
half3 rotSample = tex2D(sRotSampler4x4_16, IN.ScreenTC.zw).rgb;
rotSample = normalize((2.0 * rotSample - 1.0));

// read actual RGB and depth
float4 vRootNNND = tex2D( sceneDepthSampler, IN.ScreenTC.xy ).yzwx;
half fSceneDepth = vRootNNND.w;

// get root pixel normal
// float fNormScale = 256; // same as in TexToTexPS
//half3 WSPos = float3(IN.ScreenTC.xy, fSceneDepth*fNormScale);
float3 vNorm = vRootNNND.xyz;//normalize(cross(ddx(WSPos),ddy(WSPos)));

// range/scale conversions
half fSceneDepthM = fSceneDepth * PS_NearFarClipDist.y;
half3 vSampleScale = SSAO_params.zzw*2;
float fDepthRangeScale = PS_NearFarClipDist.y / vSampleScale.z * 0.85f;
vSampleScale.xy *= 1.0f / fSceneDepthM;
vSampleScale.z *= 2.0f / PS_NearFarClipDist.y;

float fDepthTestSoftness = 8.f/vSampleScale.z;

half4 vIndLight = 0.f;

float3 vRGB0 = tex2D( sceneBackBufferSampler, IN.ScreenTC.xy );

for(int i=0; i<nCount; i++)
{
half3 vIrrSample = mirror(arrKernel, rotSample) * vSampleScale;

float2 tc = IN.ScreenTC.xy + vIrrSample.xy;

float3 vRGB = tex2D( sceneBackBufferSampler, tc );

float4 vNNND = tex2D( sceneDepthSampler, tc ).yzwx;

vNNND.a += vIrrSample.z;

float fDepthTest = 1-saturate(0.75*abs(vNNND.a-fSceneDepth)*fDepthTestSoftness + 0.25*(vNNND.a-fSceneDepth)*fDepthTestSoftness);

half fDistance = fSceneDepth - vNNND.a;

float fDot = saturate((dot(-vNorm,vNNND.xyz)+1.0f));

float fDistanceScaled = fDistance * fDepthRangeScale * 2;

float fRangeIsValid = 1;//1-saturate( abs(fDistanceScaled) );

{
float fSceneDepth2 = vNNND.a;
float fRangeIsInvalid = saturate( abs(fSceneDepth-fSceneDepth2) * fDepthRangeScale );
fRangeIsInvalid = (saturate( abs(fDistanceScaled) ) + saturate( fDistanceScaled ))/2;
vIndLight.a += lerp(saturate((fSceneDepth2-fSceneDepth)*fDepthTestSoftness*16), 1, fRangeIsInvalid);
}

// vIndLight.rgb += lerp(1.f,vRGB*2-1,sqrt(fRangeIsValid*fDepthTest*fDot));
vIndLight.rgb += lerp(1,vRGB-0.33,sqrt(fDepthTest*fDot*4));
}

vIndLight.rgb = 3*(vIndLight.rgb - (vIndLight.rgb.x+vIndLight.rgb.y+vIndLight.rgb.z)* 0.3333f)
+ (vIndLight.rgb.x+vIndLight.rgb.y+vIndLight.rgb.z)* 0.3333f;

vIndLight = vIndLight / nCount;

OUT.Color.rgb = lerp(saturate(vIndLight.xyz), 1, saturate(vIndLight.a*6-2));
// OUT.Color.rgb = saturate(vIndLight.a*4-1.3);
// OUT.Color.rgb = saturate(vIndLight.rgb);
OUT.Color.a = 1;

return OUT;
}*/

pixout_cl Deferred_SSAO_Pass_PS(vert2fragSSAO IN)
{
pixout_cl OUT;

// define kernel
const half step = 1.f - 1.f/8.f;
half n = 0;
const half fScale = 0.025f;
const half3 arrKernel[8] =
{
normalize(half3( 1, 1, 1))*fScale*(n+=step),
normalize(half3(-1,-1,-1))*fScale*(n+=step),
normalize(half3(-1,-1, 1))*fScale*(n+=step),
normalize(half3(-1, 1,-1))*fScale*(n+=step),
normalize(half3(-1, 1 ,1))*fScale*(n+=step),
normalize(half3( 1,-1,-1))*fScale*(n+=step),
normalize(half3( 1,-1, 1))*fScale*(n+=step),
normalize(half3( 1, 1,-1))*fScale*(n+=step),
};

// create random rot matrix
half3 rotSample = tex2D(sRotSampler4x4_16, IN.ScreenTC.zw).rgb;
rotSample = (2.0 * rotSample - 1.0);

half fSceneDepth = tex2D( sceneDepthSampler, IN.ScreenTC.xy ).r;

// range conversions
half fSceneDepthM = fSceneDepth * PS_NearFarClipDist.y;

half3 vSampleScale = SSAO_params.zzw
* saturate(fSceneDepthM / 5.3f) // make area smaller if distance less than 5 meters
* (1.f + fSceneDepthM / 8.f ); // make area bigger if distance more than 32 meters

float fDepthRangeScale = PS_NearFarClipDist.y / vSampleScale.z * 0.85f;

// convert from meters into SS units
vSampleScale.xy *= 1.0f / fSceneDepthM;
vSampleScale.z *= 2.0f / PS_NearFarClipDist.y;

float fDepthTestSoftness = 64.f/vSampleScale.z;

// sample
half4 vSkyAccess = 0.f;
half4 arrSceneDepth2[2];
half3 vIrrSample;
half4 vDistance;
float4 fRangeIsInvalid;

const half bHQ = (GetShaderQuality()==QUALITY_HIGH);

float fHQScale = 0.5f;

for(int i=0; i<2; i++)
{
vIrrSample = mirror(arrKernel[i*4+0], rotSample) * vSampleScale;
arrSceneDepth2[0].x = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
if (bHQ)
{
vIrrSample.xyz *= fHQScale;
arrSceneDepth2[1].x = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
}

vIrrSample = mirror(arrKernel[i*4+1], rotSample) * vSampleScale;
arrSceneDepth2[0].y = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
if (bHQ)
{
vIrrSample.xyz *= fHQScale;
arrSceneDepth2[1].y = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
}

vIrrSample = mirror(arrKernel[i*4+2], rotSample) * vSampleScale;
arrSceneDepth2[0].z = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
if (bHQ)
{
vIrrSample.xyz *= fHQScale;
arrSceneDepth2[1].z = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
}

vIrrSample = mirror(arrKernel[i*4+3], rotSample) * vSampleScale;
arrSceneDepth2[0].w = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
if (bHQ)
{
vIrrSample.xyz *= fHQScale;
arrSceneDepth2[1].w = tex2D( sceneDepthSamplerAO, IN.ScreenTC.xy + vIrrSample.xy ).r + vIrrSample.z;
}

float fDefVal = 0.55f;

for(int s=0; s<(bHQ ? 2 : 1); s++)
{
vDistance = fSceneDepth - arrSceneDepth2;
float4 vDistanceScaled = vDistance * fDepthRangeScale;
fRangeIsInvalid = (saturate( abs(vDistanceScaled) ) + saturate( vDistanceScaled ))/2;
vSkyAccess += lerp(saturate((-vDistance)*fDepthTestSoftness), fDefVal, fRangeIsInvalid);
}
}

OUT.Color = dot( vSkyAccess, (bHQ ? 1/16.0f : 1/8.0f)*2.0 ) - SSAO_params.y; // 0.075f
OUT.Color = saturate(lerp( 0.9f, OUT.Color, SSAO_params.x ));

return OUT;
}

/*pixout_cl Deferred_SSAO_Pass_PS_Ref(vert2fragSSAO IN)
{
pixout_cl OUT;

// define kernel
const half step = 1.f - 1.f/8.f;
half n = 0;
const half fScale = 0.025f;
const half3 arrKernel[8] =
{
normalize(half3( 1, 1, 1))*fScale*(n+=step),
normalize(half3(-1,-1,-1))*fScale*(n+=step),
normalize(half3(-1,-1, 1))*fScale*(n+=step),
normalize(half3(-1, 1,-1))*fScale*(n+=step),
normalize(half3(-1, 1 ,1))*fScale*(n+=step),
normalize(half3( 1,-1,-1))*fScale*(n+=step),
normalize(half3( 1,-1, 1))*fScale*(n+=step),
normalize(half3( 1, 1,-1))*fScale*(n+=step),
};

// create random rot matrix
half3 rotSample = tex2D(sRotSampler4x4_16, IN.ScreenTC.zw).rgb;
rotSample = normalize(2.0 * rotSample - 1.0);
half3x3 rotMat;
GetRotationV0(rotSample, rotMat);

half fSceneDepth = tex2D( sceneDepthSampler, IN.ScreenTC.xy ).r;

// range conversions
half fSceneDepthM = fSceneDepth * PS_NearFarClipDist.y;

// define sampling area size
half3 vSampleScale = SSAO_params.zzw
* saturate(fSceneDepthM / 5.3f) // make area smaller if distance less than 5 meters
* (1.f + fSceneDepthM / 8.f ); // make area bigger if distance more than 32 meters

float fDepthRangeScale = PS_NearFarClipDist.y / vSampleScale.z * 0.75f;

// convert from meters into SS units
vSampleScale.xy *= 1.0f / fSceneDepthM;
vSampleScale.z *= 2.0f / PS_NearFarClipDist.y;

// sample
half fSkyAccess = 0.f;
float fDepthTestSoftness = 32.f/vSampleScale.z;
half3 irregSample;
half fSceneDepth2;
float fRangeIsInvalid;
for(int i=0; i<8; i++)
{
irregSample = mul(arrKernel, rotMat) * vSampleScale;
fSceneDepth2 = tex2D(sceneDepthSamplerAO, IN.ScreenTC.xy + irregSample.xy ).r-irregSample.z;
fRangeIsInvalid = saturate( abs(fSceneDepth-fSceneDepth2) * fDepthRangeScale );
fSkyAccess += lerp(saturate((fSceneDepth2-fSceneDepth)*fDepthTestSoftness), 0.6f, fRangeIsInvalid);
}

OUT.Color = saturate(1.3f+((SSAO_params.x-1.f)*0.35)-pow(1.f-fSkyAccess/7.0f,3)*2.5f*SSAO_params.x);

return OUT;
}*/

//////////////////////////////// technique ////////////////

pixout_cl Deferred_FillLight_Pass_PS(vert2fragSSAO IN)
{
pixout_cl OUT;

// reconstruct WS position
half SceneDepth = tex2D( depthTargetSampler, IN.ScreenTC.xy ).r;
half3 WSPos = vfViewPos.xyz + IN.WS_ViewVect * SceneDepth;

// simple lighting
half3 vLightDir = FillLightPos.xyz-WSPos.xyz;
OUT.Color = saturate(1.f-length(vLightDir) / FillLightPos.w);

#if %USE_SM30
float NdotL = saturate(dot(normalize(vLightDir),normalize(cross( ddy(WSPos),ddx(WSPos)))));
OUT.Color *= (NdotL*0.6666f+0.3333f);
#else
OUT.Color = pow(OUT.Color,2);
#endif

// range scale
OUT.Color *= FillLightColor.x / 8.f;

return OUT;
}

pixout_cl Deferred_TerrainAO_Pass_PS(vert2fragSSAO IN)
{
pixout_cl OUT;

// reconstruct pixel world position
half SceneDepth = tex2D( depthTargetSampler, IN.ScreenTC.xy ).r;
float3 vWSPos = vfViewPos.xyz + IN.WS_ViewVect * SceneDepth;

// find terrain texture coordinates
float2 texCoord = float2((vWSPos.y-AOSectorRange.y), (vWSPos.x-AOSectorRange.x)) * TerrainAOInfo.w;

// get terrain and vegetation elevations
half4 dataS0 = tex2D( TerrainInfoSampler0, texCoord );
half4 dataS1 = tex2D( TerrainInfoSampler1, texCoord );
half fTerrainZ = dataS1.a*(AOSectorRange.w-AOSectorRange.z)+AOSectorRange.z;
half fVegetZMax = fTerrainZ + dataS1.g*32.f;

// get initial sky amount, TODO: try pow() here
OUT.Color = saturate(1.f-TerrainAOInfo.g*(fVegetZMax-vWSPos.z));

// scale based on sky amount precomputed for terrain
half fTerrainSkyAmount = dataS0.a * saturate(1.f - (fTerrainZ-vWSPos.z)*0.025f);
OUT.Color = lerp(OUT.Color,1.f,fTerrainSkyAmount);

// lerp into pure terrain sky amount near the ground
half fHeightFactor = saturate((vWSPos.z-fTerrainZ)*0.5f);
OUT.Color = lerp(fTerrainSkyAmount,OUT.Color,fHeightFactor);

// apply sky brightening and fade on distance
half fDistAtt = saturate(pow(SceneDepth*PS_NearFarClipDist.y/1024.f,3));
OUT.Color = lerp(1.f, OUT.Color, (1.f - TerrainAOInfo.r)*(1.f - fDistAtt));

return OUT;
}

technique Deferred_SSAO_Pass
{
//Shadow pass
pass p0
{
VertexShader = compile vs_2_0 Deferred_SSAO_Pass_VS();

ZEnable = false;
ZWriteEnable = false;
CullMode = None;

PixelShader = compile ps_2_x Deferred_SSAO_Pass_PS();
}
}

technique Deferred_TerrainAO_Pass
{
//Shadow pass
pass p0
{
VertexShader = compile vs_2_0 Deferred_SSAO_Pass_VS();

ZEnable = false;
ZWriteEnable = false;
CullMode = None;

PixelShader = compile ps_2_0 Deferred_TerrainAO_Pass_PS();
}
}

technique Deferred_FillLight_Pass
{
//Shadow pass
pass p0
{
VertexShader = compile vs_2_0 Deferred_SSAO_Pass_VS();

ZEnable = false;
ZWriteEnable = false;
CullMode = None;

#if %USE_SM30
PixelShader = compile ps_3_0 Deferred_FillLight_Pass_PS();
#else
PixelShader = compile ps_2_x Deferred_FillLight_Pass_PS();
#endif

}
}

По моему Mr_F вроде как делал SSAO, может быть он выложит исходник...

tirarex 08.02.2013 22:20

Ответ: Вопросы про Xors3D
 
а этот никак не заюзать ?

зы, видел где то как он на авто 30 годов показывал

FREE MAN 08.02.2013 23:18

Ответ: Вопросы про Xors3D
 
Ну думаю, что можно. Времени правда надо много потратить на этот шейдер.

Владислав 09.02.2013 08:04

Ответ: Вопросы про Xors3D
 
Phyton, спасибо, не в том разделе искал. Но лучше уж через шейдер, чем по текстурке перебирать :)

Владислав 13.03.2013 19:28

Ответ: Вопросы про Xors3D
 
Привет!
Помогите разобраться, как использовать бамп с лайтмапой ? Может есть у кого подходящий шейдер? Прошу, поделитесь :)

Mr_F_ 13.03.2013 21:37

Ответ: Вопросы про Xors3D
 
кури
http://www2.ati.com/developer/gdc/D3...e2_Shading.pdf

Владислав 14.03.2013 05:56

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от Mr_F_ (Сообщение 254830)

Благодарю! Ограничен во времени сильно, думал найти решение побыстрее.

Владислав 14.03.2013 19:53

Ответ: Вопросы про Xors3D
 
Вопрос не совсем по теме, но не хочу плодить новые.

Подскажите как запечь лайтмапу на первый текстурный слой ?
т.е. материал следующий -
0 - lightmap
1 - diffuse

желательно, чтобы лайтмапа автоматически загружалась, без ручных текстурирований.

как я понял в gile[s] лайтмапа автоматически на второй слой накладывается, как быть ?

upd: вроде разобрался, пока вопрос снят:)

Mr_F_ 14.03.2013 20:52

Ответ: Вопросы про Xors3D
 
про гайлс не помню ничего. в максе проблем нет.

Владислав 21.03.2013 18:14

Ответ: Вопросы про Xors3D
 
Вложений: 1
Привет!

В поставке ксорса есть пример с шейдером mirror. Как не странно, он отражает, но мне как раз нужно от этого избавится, и оставить лишь проецирование текстуры. Может кто-нибудь помочь ?

ant0N 03.06.2013 17:58

Ответ: Вопросы про Xors3D
 
не могу понять почему Ксорс ругается на списки?
Global SMonster:TList = New TList

ant0N 03.06.2013 21:09

Ответ: Вопросы про Xors3D
 
всем спасибо, вопрос снят...

LLI.T.A.L.K.E.R. 12.04.2014 16:48

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

В общем использую стандартную тень Xors3D для лампочки у которой LightRange=15.
(размеры объектов стандартны.. например Cube=1x1x1)

Но при этом появляется глюк:


Чтобы его не было видно (как и в стандартных примерах) LightRange надо увеличивать от 100 до 1000.
НО ведь при этом обычные объекты тоже будут засвечены за километры.

Надо чтобы дальность света была не более 15, и при этом Xors3D нормально высчитывал её тени.
Подскажите какой функцией или в шейдере исправить?
(испробовал менять всевозможные параметры, но я 0 в шейдерах)

(есть вариант: для теней использовать одну лампу, а для объектов помельче. но в Blitz3D похоже нет игнорирования объекта от определённого света)

при увеличении размеров всех объектов в 10 раз - результат вычисления тот же

Кажется надо работать с xLightShadowEpsilons

LLI.T.A.L.K.E.R. 12.04.2014 17:14

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от LLI.T.A.L.K.E.R. (Сообщение 278840)
Здравствуйте!
Проблема с тенями. Прошу помочь, подсказать где исправить.

В общем использую стандартную тень Xors3D для лампочки у которой LightRange=15.
(размеры объектов стандартны.. например Cube=1x1x1)

Но при этом появляется глюк:


Чтобы его не было видно (как и в стандартных примерах) LightRange надо увеличивать от 100 до 1000.
НО ведь при этом обычные объекты тоже будут засвечены за километры.

Надо чтобы дальность света была не более 15, и при этом Xors3D нормально высчитывал её тени.
Подскажите какой функцией или в шейдере исправить?
(испробовал менять всевозможные параметры, но я 0 в шейдерах)

(есть вариант: для теней использовать одну лампу, а для объектов помельче. но в Blitz3D похоже нет игнорирования объекта от определённого света)

при увеличении размеров всех объектов в 10 раз - результат вычисления тот же

Кажется надо работать с xLightShadowEpsilons

Решение, может кому пригодится:
изменил
xLightShadowEpsilons light,0.001,0.0
на
xLightShadowEpsilons light,0.01,0.0
и глюк не заметен

LLI.T.A.L.K.E.R. 14.04.2014 03:10

Ответ: Вопросы про Xors3D
 
А есть ли Bullet Wrapper под Xors3D ?

(встроенного у себя не вижу - там тока xPhysics)
(и ни в одной dll Xors-а не вижу функции btBodyCreateTrimesh - которая есть в Bullet_B3D)

Кстати Bullet с Trimesh-ом покруче чем PhysX

moka 14.04.2014 04:20

Ответ: Вопросы про Xors3D
 
А что мешает использовать Bullet_B3D с Xors3D? Никто не запрещяет.

LLI.T.A.L.K.E.R. 14.04.2014 04:31

Ответ: Вопросы про Xors3D
 
Ошибка какая-то у Xors по загрузке данных из модели

MAV после

nsurf = xCountSurfaces(mesh)
...
...
surf = xGetSurface(mesh,ns)
nface = nface+xCountTriangles(surf)


(добавлял символ x к командам b3d)
(Xors3D последней версии с free_key)

Arton 14.04.2014 05:49

Ответ: Вопросы про Xors3D
 
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 50 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.

LLI.T.A.L.K.E.R. 14.04.2014 09:51

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от Arton (Сообщение 278930)
*** скрытый текст ***

Да, спасибо за полную free-версию.
Хотя бы понял по примерам о встроенной физике.
Так же спасибо разработчикам Xors3D.

Mr_F_ 14.04.2014 12:06

Ответ: Вопросы про Xors3D
 
Цитата:

(добавлял символ x к командам b3d)
насколько я помню, в блице нумерация сюрфейсов была с 1, а в ксорсе с 0 (и последний на 1 меньше).

Izunad 14.04.2014 13:35

Ответ: Вопросы про Xors3D
 
Как сделать оптимально? Загрузить текстуру загрузить модельку копировать ентити применяя к ней текстуру через копиентити или как то по другому? Копированные ентити будут состовлять декорации на карте 256•256, то есть хотелось бы оставить при этом возможность скрывать объекты временно не участвующие всцене. И целесообразно ли последнее?

tirarex 14.04.2014 14:53

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от Izunad (Сообщение 278941)
Как сделать оптимально? Загрузить текстуру загрузить модельку копировать ентити применяя к ней текстуру через копиентити или как то по другому? Копированные ентити будут состовлять декорации на карте 256•256, то есть хотелось бы оставить при этом возможность скрывать объекты временно не участвующие всцене. И целесообразно ли последнее?

Расставить все в максе а потом грузить xloadmesh

ну или XloadAnimmesh
и добавить их в тип

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

LLI.T.A.L.K.E.R. 14.04.2014 15:42

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от Mr_F_ (Сообщение 278937)
насколько я помню, в блице нумерация сюрфейсов была с 1, а в ксорсе с 0 (и последний на 1 меньше).

помогло! но дальше не попёрло
СПАСИБО!


(и ещё в Xors3d+Bullet квадраты и прочие объекты иногда проваливаются, так что попробую вручную совмещать)
(+ там есть встроенный Character Controller)

Печаль! Таким другим способом объекты Bulleta пропадают из виду. Даже btBodySetPosition(body,0,0,0) не помогает.

LLI.T.A.L.K.E.R. 14.04.2014 15:47

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от Izunad (Сообщение 278941)
Как сделать оптимально? Загрузить текстуру загрузить модельку копировать ентити применяя к ней текстуру через копиентити или как то по другому? Копированные ентити будут состовлять декорации на карте 256•256, то есть хотелось бы оставить при этом возможность скрывать объекты временно не участвующие всцене. И целесообразно ли последнее?

в Xors3D есть же instancing (хотя я сам в этом ещё не разбирался)

ну а в Blitz3D есть вариант: Single Surface Entity System (но он похоже не подходит - думаю там нет возможности скрывать невидимые частицы)

Секционная разбивка - ещё вариант, который пока я приостановил (так как типа-DeltaForce-игрулю временно отставил)

кстати можно скрестить Single Surface Entity System + секционная разбивка
либо использовать встроенный instancing
или добавить LOD-system и всё-всё совмещать

(но графика как в GTA3-4-style с этим не потянет)

Думаю максимум что можно выжать из Blitz3D*Xors3D - уровень графики FarCry

LLI.T.A.L.K.E.R. 14.04.2014 16:27

Ответ: Вопросы про Xors3D
 
А может догадываетесь почему все объекты исчезают из вида?

Беру рабочий пример Bulleta припаиваю его к рабочему игро-коду Xors3D.
Дописываю символ x в функции. Никаких ошибок. TriMesh загружается.

Но при присоединении mesh к bullet_body они исчезают...
Видимо координаты или расчёты не совместимы... Хотя даже банальный КУБ исчезает.
_ _ _
Либо почему в Xors3D_Bullet объекты выпадают в TriMesh...

_ _ _
я не ленивый и не глупый
испробовал всякие варианты скрещивания физических TriMesh-ей в Xors3D (даже PhysX)

_ _ _
в общем пока буду основываться на стандартном xEntityCollided
а то изучение физик задерживает игрулю

tirarex 14.04.2014 19:17

Ответ: Вопросы про Xors3D
 
LLI.T.A.L.K.E.R. Ты гениален ! Вроде как в ксорсе и есть буллет а физикс был убран .

LLI.T.A.L.K.E.R. 14.04.2014 19:52

Ответ: Вопросы про Xors3D
 
Во вшитом-Bullet-в-Xors3D квадраты и прочие объекты иногда проваливаются в TriMesh..

Тэкс, почитал тему: Xors3D + PhysX Проблемы
совместил работу отдельного PhysX с Xors3D без ошибок и пр. - НО при соединении mesh к px_body объекты исчезают..
УРА!! Как ранее заметил чьё-то замечание

Эффективней использовать
xPositionEntity pxC\mesh,pxBodyGetPositionX#(pxC\body),pxBodyGetPo sitionY#(pxC\body),pxBodyGetPositionZ#(pxC\body)
вместо
;pxBodySetEntity pxC\mesh,pxC\body

Кажись пока на Physx перейду. Опять таки проверю его на тримэш.
(так как уже делал заготовку по "движению игрока")

Arton 15.04.2014 04:06

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от LLI.T.A.L.K.E.R. (Сообщение 278956)
Во вшитом-Bullet-в-Xors3D квадраты и прочие объекты иногда проваливаются в TriMesh..

У меня такое было когда прикрутил булит отдельно (нужны были мягкие тела, тот что в хорсе, там нет).

Izunad 20.04.2014 13:34

Ответ: Вопросы про Xors3D
 
Объясните понятным языком, как писать шейдер если пишешь на PureBasic+Xors3D. Как подключать шейдер. Я просто столько теории прочитал, а механизм применения так и не понял.

Arton 20.04.2014 14:19

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от Izunad (Сообщение 279182)
Объясните понятным языком, как писать шейдер если пишешь на PureBasic+Xors3D. Как подключать шейдер. Я просто столько теории прочитал, а механизм применения так и не понял.

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

Шейдеры не зависят от используемых инструментов, нету разницы PureBasic+Xors3D, или Blitz3D+Xors3D, или C#+Xors3D.

Здесь полная версия с примерами по шейдерам.

Так официальный сайт похоже сдох окончательно :(

Не знаю каким учебником пользовался, но на всякий случай выкладываю.

P. S. Мда, там примеры только для блица, надеюсь учебник понадобится :dontknow:

Samodelkin 20.04.2014 14:58

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

moka 21.04.2014 06:37

Ответ: Вопросы про Xors3D
 
Цитата:

Сообщение от Izunad (Сообщение 279182)
Объясните понятным языком, как писать шейдер если пишешь на PureBasic+Xors3D. Как подключать шейдер. Я просто столько теории прочитал, а механизм применения так и не понял.

Лично советую больше экспериментировать нежели читать теорию.
Я в самые начала Xors3D на нашем форуме был один из первых кто "ринулся седлать" шейдеры, и начал с чтивы тоже, но далеко не ушёл. Затем перешёл на эксперименты.
Главное понять основные принципы потока данных и как работает конвейер шейдера - движок указывает какие данные посылать в шейдер от объекта, при рендере эти данные попадают в вершинный шейдер, и функция вершинного шейдера пробегается по каждой вершине. Какие-то данные можно отдать далее по конвейеру в фрагментный шейдер. В фрагментном (пиксельный как иногда не правильно называют), шейдер обрабатывает каждый тексель что попадает в экран, именно тексель а не пиксель на объекте. Там доступны данные из вершинного шейдера в интерполированном виде (например между 3 вершинами по середине), и всё что требуется это выдать цвет.
Какой цвет - уже дело конечно твоё, там используется математика и операции с матрицами. Как работает сама математика матриц - знать по началу не нужно, а вот основную логику что они делают - стоит.
Далее пробуй и экспериментируй, в Xors3D есть набор с простых к более сложным шейдерам (mSL) который я будучи нюбом когда-то написал.

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

Больше практики и экспериментов, начинай с простого.


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

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