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

dsd 21.11.2011 02:02

Ответ: Странное.
 

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

moka 21.11.2011 02:32

Ответ: Странное.
 
Нормали как-то странно пляшут, ты случаем их не высчитываешь в вершинном шейдере и потом применяешь в пиксельном уже результат? Лучше это делать в пиксельном, тогда будет в разы лучше результат, и некрасивостей с нормалями таких не будет..

А вообще, молодцом что шейдеры стал познавать лучше, только лучше не в RenderMonkey, а в блокноте..

dsd 21.11.2011 02:41

Ответ: Странное.
 
Это у меня модель дико косячная :) Она с 3 версии макса прошла до 9 все версии а потом через 3дс вернулась в восьмую :) Походу всю поверхность перенатянуть надо. Но если смогу прикрутить глос и как-то приделать ихние спаркле будет супер шейдер с тучей настроек :)

dsd 21.11.2011 16:27

Ответ: Странное.
 

Какой-то металик.

dsd 22.11.2011 00:17

Ответ: Странное.
 

duotone with some kinder of sparkles.

moka 22.11.2011 01:39

Ответ: Странное.
 
Только туда бы ещё кубмапу ввалить по Френелю или какому параметру из шейда машины, вот там где затенение - заместо него кинуть именно кубмапу (курни Fresnel shading).

dsd 23.11.2011 12:57

Ответ: Странное.
 

По-моему вполне симпатичная краска вышла. В динамике она красивее.

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ; // матрица итоговая
float4x4 matrixWorld : MATRIX_WORLD; // матрица мировая
float3 lightDirection : LIGHT0_DIRECTION; // направление
float4 lightColor : LIGHT0_COLOR; // цвет
float4 entityColor : COLOR_DIFFUSE; // цвет объекта
float4 campos : CAMERA_POSITION;
float4 ambient : COLOR_AMBIENT ;


float4x4 view_proj_matrix : MATRIX_VIEWPROJ;
float4x4 proj_matrix : MATRIX_PROJ;
float4x4 inv_view_matrix : MATRIX_WORLDVIEWINVERSE;

//параметры краски
float4 paintColorMid;
float4 paintColor2;
float4 paintColor0;


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




// входная структура для вершинного шейдера
struct VSInput
{
float4 Pos : POSITION;
float3 Normal : NORMAL;
float2 Tex : TEXCOORD0;

};
// структура для результата вершинного шейдера
struct VSOutput
{
float4 Pos : POSITION;
float2 Tex : TEXCOORD0;
float3 Normal : TEXCOORD1;
float3 View : TEXCOORD2;
float2 SparkleTex : TEXCOORD3;
float3 Pos2 : TEXCOORD4;
};
// вершинный шейдер
VSOutput VSMain(VSInput input)
{

VSOutput output;
// Propagate transformed position out:
output.Pos = mul( input.Pos,matrixWorldViewProj );

// Compute view vector:
output.View = normalize( mul(campos-input.Pos,matrixWorld));

// Propagate texture coordinates:
output.Tex = input.Tex;

// Propagate tangent, binormal, and normal vectors to pixel shader:
output.Normal = input.Normal;
// Compute microflake tiling factor:
output.SparkleTex = 5*float2( output.Pos.x/output.Pos.w , output.Pos.y/output.Pos.w );
output.Pos2 =mul(input.Pos.xyz,proj_matrix);
return output;
// возвращаем результат
return output;
}
// пиксельный шейдер
float4 PSMain(VSOutput input) : COLOR0
{
//для отражзения
float lit = dot(normalize(input.Normal), -lightDirection);
float3 vView = input.View ;
//шум+частицы
float4 sparklecolor=tex2D(diffuseSampler,input.Pos2.xy*in put.Pos2.yz);
float alit=dot(normalize(input.Pos2+0.23*(2*sparklecolor .rgb-float3(1,1,1))), input.Normal);

// Compute reflection vector resulted from the clear coat of paint on the metallic
// surface:
float fFresnel = dot(vView,input.Normal+0.1*(sparklecolor.rgb-float3(1,1,1)));

// Compute final paint color: combines all layers of paint as well as two layers
// of microflakes
float fFresnelSq = fFresnel*fFresnel;
float4 paintColor = fFresnel*paintColor0+fFresnelSq*paintColorMid+fFre snelSq*fFresnelSq*paintColor2;


//отражения
// Look up the reflection
float3 reflVec = reflect(input.View, input.Normal);
float sins=sqrt(1-reflVec.y*reflVec.y);
float ucoor=acos(reflVec.x/sins)/6.28;
float vcoor=acos(reflVec.y)/6.28;
float2 texcoor=float2(ucoor,vcoor);
float4 reflection = tex2D(showroomMap, texcoor);


float4 finalColor;
finalColor.a = 1.0;
finalColor.rgb = paintColor;

return 1.5*finalColor*reflection+0.25*alit*finalColor+0.4 *(1-lit)*reflection;

}
// техника для отрисовки
technique Diffuse
{
pass p0
{
VertexShader = compile vs_2_0 VSMain();
PixelShader = compile ps_3_0 PSMain();
}
}

HolyDel 23.11.2011 16:37

Ответ: Странное.
 
Вложений: 1
стэлс машина
HD 6850 M
Win7

dsd 23.11.2011 16:57

Ответ: Странное.
 


А с этим слегка упрощенным шейдером? Походу косяк с матрицей какой-нить :)

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ; // матрица итоговая
float4x4 matrixWorld : MATRIX_WORLD; // матрица мировая
float3 lightDirection : LIGHT0_DIRECTION; // направление
float4 lightColor : LIGHT0_COLOR; // цвет
float4 entityColor : COLOR_DIFFUSE; // цвет объекта
float4 campos : CAMERA_POSITION;
float4 ambient : COLOR_AMBIENT ;


float4x4 view_proj_matrix : MATRIX_VIEWPROJ;
float4x4 proj_matrix : MATRIX_PROJ;
float4x4 inv_view_matrix : MATRIX_WORLDVIEWINVERSE;

//параметры краски
float4 paintColorMid;
float4 paintColor2;
float4 paintColor0;


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




// входная структура для вершинного шейдера
struct VSInput
{
float4 Pos : POSITION;
float3 Normal : NORMAL;
float2 Tex : TEXCOORD0;

};
// структура для результата вершинного шейдера
struct VSOutput
{
float4 Pos : POSITION;
float2 Tex : TEXCOORD0;
float3 Normal : TEXCOORD1;
float3 View : TEXCOORD2;
float2 SparkleTex : TEXCOORD3;
float3 Pos2 : TEXCOORD4;
};
// вершинный шейдер
VSOutput VSMain(VSInput input)
{

VSOutput output;
// Propagate transformed position out:
output.Pos = mul( input.Pos,matrixWorldViewProj );

// Compute view vector:
output.View = normalize( mul(campos-input.Pos,matrixWorld));

// Propagate texture coordinates:
float3 reflVec = normalize(reflect(output.View, input.Normal));
float sins=sqrt(1-reflVec.y*reflVec.y);
output.Tex = float2(acos(reflVec.x/sins)/6.28,acos(reflVec.y)/6.28);

// Propagate tangent, binormal, and normal vectors to pixel shader:
output.Normal = normalize(input.Normal);
// Compute microflake tiling factor:
//output.SparkleTex = 5*float2( output.Pos.x/output.Pos.w , output.Pos.y/output.Pos.w );
output.Pos2 =mul(input.Pos.xyz,proj_matrix);
output.SparkleTex = 5*output.Pos2.xy*output.Pos2.yz;
return output;
// возвращаем результат
return output;
}
// пиксельный шейдер
float4 PSMain(VSOutput input) : COLOR0
{
//для отражзения
float lit = dot(input.Normal, -lightDirection);
float3 vView = input.View ;
//шум+частицы
float4 sparklecolor=tex2D(diffuseSampler,input.SparkleTex );
// Compute reflection vector resulted from the clear coat of paint on the metallic
// surface:
float fFresnel=dot(vView,input.Normal+0.2*(sparklecolor. rgb-float3(1,1,1)));

// Compute final paint color: combines all layers of paint as well as two layers
// of microflakes
float fFresnelSq = fFresnel*fFresnel;
float4 paintColor = fFresnel*paintColor0+fFresnelSq*paintColorMid+fFre snelSq*fFresnelSq*paintColor2;


//отражения
// Look up the reflection

float4 reflection = tex2D(showroomMap, input.Tex);
return 2*paintColor*reflection+0.3*lit*reflection;

}
// техника для отрисовки
technique Diffuse
{
pass p0
{
VertexShader = compile vs_2_0 VSMain();
PixelShader = compile ps_2_0 PSMain();
}
}

dsd 23.11.2011 18:54

Ответ: Странное.
 

Отоптимиздил шейдер по полной. Теперь тормоза только от хайполи колес :)

У кого не отрисуется машинка отпишитесь :). Хотя единственное радикальное отличие от стандартного шейдера в примерах только в этом:

float4x4 proj_matrix : MATRIX_PROJ;

float4 Pos2 =mul(input.Pos,proj_matrix);

PHP код:

float4x4 matrixWorldViewProj MATRIX_WORLDVIEWPROJ// матрица итоговая
float4x4 matrixWorld MATRIX_WORLD// матрица мировая
float4x4 proj_matrix MATRIX_PROJ;
float3 lightDirection LIGHT0_DIRECTION// направление
float4 lightColor LIGHT0_COLOR// цвет
float4 entityColor COLOR_DIFFUSE// цвет объекта
float4 campos CAMERA_POSITION;
float4 ambient COLOR_AMBIENT ;



//параметры краски
float4 paintColorMid;
float4 paintColor2;
float4 paintColor0;

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


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




// входная структура для вершинного шейдера
struct VSInput
{
float4 Pos      POSITION
float3 Normal  NORMAL;
};
// структура для результата вершинного шейдера
struct VSOutput
{
   
float4 Pos        POSITION;
   
float2 Tex        TEXCOORD0;
   
float3 Normal     TEXCOORD1;
   
float3 View       TEXCOORD2;
   
float2 SparkleTex TEXCOORD3;
};
// вершинный шейдер
VSOutput VSMain(VSInput input)
{
   
VSOutput output;
   
// Propagate transformed position out:
   
output.Pos mul(input.Pos,matrixWorldViewProj);
   
// Compute view vector: 
   
output.View normalizemul((campos-input.Pos),matrixWorld));
   
output.Normal   mul(input.Normal,matrixWorld);
   
// Propagate texture coordinates:
   
float3 reflVec reflect(output.Viewoutput.Normal);
   
float sins=sqrt(1-reflVec.y*reflVec.y);
   
output.Tex float2(acos(reflVec.x/sins)/6.28,acos(reflVec.y)/6.28);
   
// Compute microflake tiling factor:
   
float4 Pos2   =mul(input.Pos,proj_matrix);
   
output.SparkleTex =3*Pos2.xy*Pos2.yz;
   return 
output;
// возвращаем результат
return output;
}
// пиксельный шейдер
float4 PSMain(VSOutput input) : COLOR0
{
   
float3 vView =  input.View ;
   
//шум+частицы
   
float4 sparklecolor=tex2D(diffuseSampler,input.SparkleTex);
   
float  fFresnel=dot(vView,input.Normal+0.25*sparklecolor);
   
// of microflakes
   
float  fFresnelSq fFresnel*fFresnel;
   
float4 paintColor fFresnel*paintColor0+fFresnelSq*paintColorMid+fFresnelSq*fFresnelSq*paintColor2
    
// Look up the reflection
   
float4 reflection tex2D(showroomMapSamplerinput.Tex);


   return 
0.75*paintColor*reflection+0.45*reflection*sqrt(1-fFresnelSq);
   
}
// техника для отрисовки
technique Diffuse
{
pass p0
{
VertexShader compile vs_2_0 VSMain();
PixelShader compile ps_2_0 PSMain();
}


А косяк может быть в том, что у команды mul(position,matrix) в хорсе, а в рендерманке mul(matrix,position)?

HolyDel 24.11.2011 13:58

Ответ: Странное.
 
машина появилась

dsd 26.11.2011 15:22

Ответ: Странное.
 

Пытаюсь сочинять шейдер неба.

Как в сферических координатах можно на сфере рисовать окружность равного диаметра? От вектора втыкающегося в точку находить перпендикуляр и вращать вокруг точки?

dsd 26.11.2011 16:10

Ответ: Странное.
 
Шейдер машины ржачно раскрашивает морда :)

moka 26.11.2011 19:33

Ответ: Странное.
 
Про солнышко, всё просто: есть у тебя вектор - где сейчас солнце находится. И есть у тебя вектор между камерой и пикселем на скайбоксе. Делаешь DOT этих двух векторов, и далее математикой или по условию, выбираешь то что больше 0.95 - то солнце, а что меньше - то небо.

dsd 26.11.2011 21:27

Ответ: Странное.
 

Это анализ нормали.
float deg=dot(input.viewVec,input.normal);
if(deg>0.98){diffuse=float4(1,1,0,1);}
Причем как управлять позицией мне не ясно :)


Это анализ расстояния от пикселя в центре солнца
float3 sunpos=50*float3(0,1,0);
float3 pixpos=input.pos2.xyz;
float3 vecpixsun=sunpos-pixpos;
float dist=length(vecpixsun);
if(dist<4){diffuse=float4(1,1,0,1)}
И, да простит меня Мока, управление позицией элементарно, диаметр тоже легко изменить, ну и контур менее зависим от геометрии небосклона.

dsd 26.11.2011 23:44

Ответ: Странное.
 

А еще эти облачка плавно меняются :)

.Squid 27.11.2011 03:05

Ответ: Странное.
 
Погляди на оф.форуме. Там товарищ ascii1457 уже делал шейдеры неба с солнцем. Может наведет на какие-то мысли.

moka 27.11.2011 03:37

Ответ: Странное.
 
Да и я в RUST'е делал, с изменением размера динамично исходя из положеня, ведь в зените будет маленькое..
Вот вырезки из шейдера, за стиль приношу извенения, раньше опыта и дисциплины не хватало:

Код:

VecSky.xyz = normalize(PosCam-IN.pWorld);
DotSun = pow(max(dot(VecSun,VecSky.xyz),0.0f),SizeSun);
Color.rgb += DotSun;

VecSky.xyz - это тупо вектор от центра камеры к обрабатываемому пикселю.
VecSun - это вектор (переменная), которую ты посылаешь с кода. Вектор от камеры, где солнце находится, например { 0,1,0 } - это вертикально сверху.
SizeSun нада большим числом, попробуй сперва 10f например, потом поэксперементируй, я не помню уже.
Собственно и всё. На деле всё ОЧЕНЬ просто, и можно без проблем регулировать и положение и размер, и цвет да что угодно. Не мудри с нормалями - они не стабильны, используй как предложил вектор между камерой и позицией пикселя.

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

dsd 27.11.2011 03:53

Ответ: Странное.
 
Мока, я сделал по другому. Семантикой получаю направление света. Умножаю его на -1. Умножаю на масштаб вывернутой наизнанку сферы прикидывающейся небосводом. Це позиция светила на небесной сфере. Потом вычитая из позиции центра солнца позициею пикселя имею вектор. Длину которого узнать изноупроблем. Если длина меньше радиуса светила, то цвет подменяется на цвет солнца в этой точке.

Профит. Автоматически управляемое хорсом солнце одинакового диаметра независимо от позиции. И да, я не использую нормали, я просто рисую на сфере. Надо бы вкуриться в то как расписывают купола, но это будет уже не нормально :)

Просто снижение яркости картинки при взгляде на солнце это HDR? По моему это должно быть более сложным анализом картинки, основанном на 3-4 кадрах хотя бы за секунду, что ли.

moka 27.11.2011 04:00

Ответ: Странное.
 
Вложений: 4
Цитата:

Сообщение от dsd (Сообщение 211381)
Мока, я сделал по другому. Семантикой получаю направление света. Умножаю его на -1. Умножаю на масштаб вывернутой наизнанку сферы прикидывающейся небосводом. Це позиция светила на небесной сфере. Потом вычитая из позиции центра солнца позициею пикселя имею вектор. Длину которого узнать изноупроблем. Если длина меньше радиуса светила, то цвет подменяется на цвет солнца в этой точке.

Профит. Автоматически управляемое хорсом солнце одинакового диаметра независимо от позиции. И да, я не использую нормали, я просто рисую на сфере. Надо бы вкуриться в то как расписывают купола, но это будет уже не нормально :)

Получается что тебе надо обязательно ставить сферу на положение в шейдере как и размер сферы неба? А что с триангуляцией неба? Или например заюзать хочешь кубмапу? Мой вариант имхо, более независимый от тонкостей, и выдаёт не резкий результат (края не пиксильные).
Делай не расстояние пикселя к сфере солнца, а по векторам, как предлагаю, будет то же самое что у тебя, только без пикселизации на гранях, и абсолютной не зависимости от геометрии неба (куб, сфера, да хоть плэйн перед камерой, и т.п.).
Вектор солнца - также из семантики можно без проблем вычислить - это тупо нормализированная позиция солца - позиция камеры.

UPD:
Вот сделал скрины, далёкий 2008ой..

dsd 27.11.2011 04:08

Ответ: Странное.
 
Мока, наши деревья в этом вопросе сильно разные :)

Говоря про пикселезацию это ты намекаешь на то, что я края у солнца не смазал? Я там собирался какой-нить сложный градиент сочинить. Я скачал твой раст, завтра буду потрошить :)

moka 27.11.2011 04:16

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 211384)
Мока, наши деревья в этом вопросе сильно разные :)

Говоря про пикселезацию это ты намекаешь на то, что я края у солнца не смазал? Я там собирался какой-нить сложный градиент сочинить. Я скачал твой раст, завтра буду потрошить :)

Ну глянь скрины выше.

Да и это скорее я не как "лучше я думаю", а скорее с точки зрения кривости самой реализации. Если рассматривать реализацию чего-либо, алгоритма, механизма, шаблона, интерфейса, да чего угодно, то она должна как можно меньше зависеть от "потайных" правил. Например у тебя есть они - длина вектора ДОЛЖНА быть радиусом сферодомы неба. Сферодома - должна иметь достаточную триангуляцию, иначе будут артефакты.
Все эти "или", "если", и т.п. - плохой тон в любой сфере программирования. Старайся их избегать, либо реюзабельность идей и даже исходника - сомнительна и специфична, тем более другими людьми.

.Squid 28.11.2011 02:55

Ответ: Странное.
 
Мока, а можно машиной из Раста воспользоваться в примерах Хорса?

moka 28.11.2011 03:13

Ответ: Странное.
 
Цитата:

Сообщение от .Squid (Сообщение 211457)
Мока, а можно машиной из Раста воспользоваться в примерах Хорса?

Надо у m_512 (Михаил) спросить..

HolyDel 28.11.2011 09:17

Ответ: Странное.
 
а вас не стремает писать сложный шейдер для фона? не проще солнышко по старинке нарисовать поверх неба? или лучше небо поверх солнца?

Arles 28.11.2011 10:01

Ответ: Странное.
 
Крутые пацаны не ищут легких путей! )

dsd 28.11.2011 15:31

Ответ: Странное.
 

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

moka 28.11.2011 16:40

Ответ: Странное.
 
Цитата:

Сообщение от HolyDel (Сообщение 211470)
а вас не стремает писать сложный шейдер для фона? не проще солнышко по старинке нарисовать поверх неба? или лучше небо поверх солнца?

Для неба, это вовсе не сложно, намного тяжелее вода, или тени, во много раз.

Можно сделать и текстурой уху, но никакой динамики толком не сделаешь, тем более зачем тебе текстура, если это тупо окружность? Тем более если хочешь использовать полноценный HDR, то использование цвета который ярче чем 1.0f, то именно процедурно это намного лучше реализовывать. Изменение размера тоже. Да и шустрее, чем выборки делать постоянные.
Вот например использовать текстуру для проекции спутников в небе - уже другой вариант, но и тут снова, если нужна реально красота и реалестичная атмосфера, тогда вообще нужно это дело делать используя атмосферный скаттеринг (подобие Volumetric Fog), чтобы атмосфера также влияла и на всё окружение (туман), и солнце уже можно делать тупо сферой в космосе, как и спутники.

В общем dsd - не занимайся извратами, серьёзно.. Это тебе пользы не принесёт.

dsd 28.11.2011 17:10

Ответ: Странное.
 
Книга Притчи > Глава 21 > Стих 29:
Человек нечестивый дерзок лицом своим, а праведный держит прямо путь свой.

Книга Притчи > Глава 28 > Стих 10:
Совращающий праведных на путь зла сам упадет в свою яму, а непорочные наследуют добро.

:-D

moka 28.11.2011 17:41

Ответ: Странное.
 
Че? ЛоЛ.
Поржать - стёбно. Но как ты можешь приводить вторую притчу, не зная сути обеих путей? Если ты разделяешь на "зло / добро", тогда ты должен знать, что зло, а что есть добро. Иначе у тебя будет каша и всё вперемешку. Собственно так и есть - ты очень часто в своём коде допускаешь кучу архитектурных и логических ошибок. Они не фатальны, но логика кода и тем более читабельность страдают очень сильно.

Проблема наглядна: тебе не хватает базовых знаний. У меня также было раньше, ведь я тоже полностью самоучка. Я писал абы как, лишь бы работало. Но потом начал чуток почитывать мелких статей, или кусков дельной литературы на эту тему, да и сам пришёл ко многим выводам, и нынче отдаю важный приоритет не цели, а её реализации. Т.к. именно эта реализация определяет как качество выполненной задачи, так и возможность многократного использования и логических идей, так и самого кода вообще.

Ты как программист - это в первую очередь твоё мышление, его чистота и сложность в тоже время. А не то что ты там когда-то написал или разработал.
Поэтому я тут не антигерой как раз, а наоборот..

dsd 28.11.2011 17:42

Ответ: Странное.
 
Я тебя затролил :)

dsd 28.11.2011 19:20

Ответ: Странное.
 
Кстати рисование на кубике весьма здравая мысля, ибо у него нормали довольно информативны. А солнце наверно следует рисовать исходя из позиции пикселя на экране. Оно то один хрен круглое и одного размера, то есть можно считать просто радиус вектора в x/w и y/w после всех перемножений. А облачка пустить по верхней грани куба, и лепота.

moka 28.11.2011 19:36

Ответ: Странное.
 
Рисовать солнце в скрин спейс - не оправдано, проблема будет заключаться в перспективе, т.к. с камерой и разными FOV'ами будет лажово выглядеть. Плюс, зачем проецировать в экранные координаты, если это мировых координат объект.

Я не понимаю зачем ты упираешься от самой первой мной предложенной идеи, которая сама простая, и имеет наименьшее количество минусов из всех здесь озвученных "решений"?

HolyDel 28.11.2011 19:47

Ответ: Странное.
 
делать сложные расчеты в скринспей шейдере, особенно много демонического бранчинга - не оправдано.

moka 28.11.2011 19:48

Ответ: Странное.
 
Цитата:

Сообщение от HolyDel (Сообщение 211557)
делать сложные расчеты в скринспей шейдере, особенно много демонического бранчинга - не оправдано.

Тру!

Такая простая задача блин, а извращаются..

dsd 28.11.2011 19:56

Ответ: Странное.
 
Нет там никаких убер расчетов. А уцепился я почему, поймешь если наберешься терпения и в демке на уровне зеленой травы присмотришься к смешиванию цвета облаков и цвета солнца. Притом что это корявый первый попавшийся градиент еще и растянутый из кривой пережатой жпгешки.

moka 28.11.2011 19:59

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 211563)
Нет там никаких убер расчетов. А уцепился я почему, поймешь если наберешься терпения и в демке на уровне зеленой травы присмотришься к смешиванию цвета облаков и цвета солнца. Притом что это корявый первый попавшийся градиент еще и растянутый из кривой пережатой жпгешки.

На работе запустить не могу. Скрины давай.

Я делал облака, и они должны быть реализованы не зависимо от атмосферы вообще.

dsd 28.11.2011 20:05

Ответ: Странное.
 

Но мне именно в динамике нравица

moka 28.11.2011 20:15

Ответ: Странное.
 
Эмм.. Тупо смешивание ADD'итивное, и что с этого?
Во первых бленд ADDITIVE для облаков - это изврат и не реалистично. Во вторых что тут такого? Точно такое же будет с солнцем отрисованным процедурно..
При этом процедурно можно сделать и покруче со всякими ореолами и т.п.

dsd 28.11.2011 20:24

Ответ: Странное.
 
Да ёклмнж!

Хотя впрочем :rolleyes: Научи меня, гуру, приведи текст шейдера и процедуры с человеческими комментариями понятными даже детсадовцу.

Очень жду. Уверен не я один. Тем более ж они у тебя универсальные. Токмо xSetEntityEffect() и красотища.

moka 28.11.2011 22:58

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 211580)
Да ёклмнж!

Хотя впрочем :rolleyes: Научи меня, гуру, приведи текст шейдера и процедуры с человеческими комментариями понятными даже детсадовцу.

Очень жду. Уверен не я один. Тем более ж они у тебя универсальные. Токмо xSetEntityEffect() и красотища.

Тебе нужно атмосферный эффект с солнцем? Сделаю на выходных, на основе старых наработок (2008го).

dsd 28.11.2011 22:59

Ответ: Странное.
 
Мне больше туториал нужен, а эффект я и сам напишу :)

moka 29.11.2011 15:48

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 211605)
Мне больше туториал нужен, а эффект я и сам напишу :)

Тебе нужно разжевать как и что?
Дык, в гугле этого полно..

dsd 29.11.2011 18:35

Ответ: Странное.
 
Не не не, я так просто от халявы не откажусь.

Так что хрен с ним тутором. Сбацай мне анимированные облачка, кульное солнышко с цветом зависящим от высоты. Шоб облачка подсвечивались в зависимости от высоты нужным цветом. И т.д. И сверху чтобы это было жирным труашдэром сдобрено. Еще ты говорил про эффект линз и т.д.

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

moka 29.11.2011 18:41

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 211688)
Не не не, я так просто от халявы не откажусь.

Так что хрен с ним тутором. Сбацай мне анимированные облачка, кульное солнышко с цветом зависящим от высоты. Шоб облачка подсвечивались в зависимости от высоты нужным цветом. И т.д. И сверху чтобы это было жирным труашдэром сдобрено. Еще ты говорил про эффект линз и т.д.

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

Сделаю без облачков, а лишь небо.
Вообще возьми пример готовый, из RUST'а, там небо уже есть. Я хочу попробовать сделать же небо используя Volume метод. С туманом и т.п.

.Squid 29.11.2011 19:19

Ответ: Странное.
 
Вложений: 1
Ну я же говорил, посмотри на оф.форуме. Облака, конечно, не верх реалистичности, но все же.

dsd 29.11.2011 23:04

Ответ: Странное.
 
Я все посмотрю, со временем... Ближе к НГ будут сдвиги :)

dsd 30.11.2011 16:30

Ответ: Странное.
 
Як мне заставить кодеблокса не распихивать объекты по разным потокам?
Ибо:

Код:

  land uno(1,6,32); //скэйл ячейки, кол-во сегментов в ширину, разрешение сегмента
    paint_land texture;
    texture.texture(uno.surf->mesh);
    texture.texture(uno.surfm->mesh);
    float3 posit=uno.get_position(0,0);
    xPositionEntity(Camera,0,posit.y+10,0);
    river riv_water(uno.first->uppersize,uno.first);
    tree_col trees;

Объект выделенным красным логически создается позже и обращается к данным класса ланд. Но на деле получается, что необходимые данные ищо не успевают сгенериться и даже память под них не выделяется. Происходит крэш при запуске, хотя компилится без вопросов.
Впихивать в один объект мне не хочется. Есть какие-нить способы приказать компилятору выполнять код последовательно?

Ложная тревога я в массив писать пытался одновременно с созданием ибо скобочек дохренища.

dsd 30.11.2011 21:42

Ответ: Странное.
 

Если накосячить как нить так:
for(int i=0;i<uppersize-16;i=i+16){
for(int j=0;j<uppersize-16;j=j+16){}}
//должен найти точную точку на побережье в избранном тайле.
if(seed[i+1][j]==4){

MessageBox(
NULL,
i+"Ворнинг! ",
"Фатальная ошибка",
MB_OK | //OK (кнопки)
MB_DEFBUTTON1 | //Выделеная кнопка
MB_ICONEXCLAMATION | //Тип иконки
MB_DEFAULT_DESKTOP_ONLY
);

}

}}
:)

dsd 03.12.2011 23:25

Ответ: Странное.
 

Кажется, я все-таки смогу сделать правдивые реки со временем.

//aim of this function is to find all points which are higer, than current and
//that point should have point close to it with height is lower than that.
//after all that points will it find, it should sort that array from closest to farest
//so, it's will quite right to say< that the closest point with extremum will be new
//point of river line, just because it is.
//Also is fair enought to say that i shoud to perfom such kind of operation only for one
//time in cycle of terrain creation. So this function should only check that data was created
//before it's initialization.

Почему я не мог сочинить это на русском?

pozitiffcat 04.12.2011 00:50

Ответ: Странное.
 
МОЙ МОСК :SOS: :SOS: :SOS: ЧТО ЭТО?

dsd 04.12.2011 00:57

Ответ: Странное.
 
Ты про то косое месиво пвседоанглийских слов или картинку?

pozitiffcat 04.12.2011 01:03

Ответ: Странное.
 
Цитата:

Кажется, я все-таки смогу сделать правдивые реки со временем.
Я про картинку ))) не понял причем тут реки)))

dsd 04.12.2011 01:08

Ответ: Странное.
 
Розовое ледники. Красное возможные истоки самых крупных рек. голубое случайно выбранные истоки рек. Синие, чего практически не видно фактическое местоположение реки до первой впадины заполнение и выход из которой я и описывал на своем корявом инглише. отображаемая часть моего ландшафта в этом масштабе примерно 2х2 пикселя. Черное уровень моря. Серое анализируемый ландшафт.

dsd 06.12.2011 18:31

Ответ: Странное.
 

Новый "ручной" ствол дерева. 800 полигонов на штучку. Мож ну его эти самогенерируемые деревья?

dsd 07.12.2011 16:25

Ответ: Странное.
 
В процессе экспериментов походу придумал что-то, чем после некоторых продолжительных плясок с бубном можно сильно повысить резкость изображения.

Зачем то прикрутил gaussiаn blur. Впрочем то, что он работает это плюс :)

dsd 07.12.2011 23:27

Ответ: Странное.
 

У облачков теперь есть края.

pozitiffcat 08.12.2011 10:09

Ответ: Странное.
 
клевые облака.
Пили свой двиг полностью на шейдерах ;-)

Reizel 08.12.2011 12:43

Ответ: Странное.
 
у позиффиката мания запилить все в свой движок\обертку xD

pozitiffcat 08.12.2011 13:39

Ответ: Странное.
 
Цитата:

Сообщение от Reizel (Сообщение 213005)
у позиффиката мания запилить все в свой движок\обертку xD

Почему бы и нет.. но я имел ввиду писать самому с нуля ))

dsd 10.12.2011 20:48

Ответ: Странное.
 


PHP код:

float4 PSMain(VSOutput input) : COLOR0
{

        
float height=pow((200-input.viewVec.y)/200,2);
        
//цвет у горизонта 222 251 255
        //цвет в зените 87 124 179
        
float red=(87+135*height)/255;
        
float green=(124+127*height)/255;
        
float blue=(179+76*height)/255;
        
float4 diffuse =float4(red,green,blue,1);
        
//the sun
        
float3 sunpos=lightDirection;
        
        
float3 pos=normalize(input.viewVec.xyz);
        
        
float grad=dot(pos,-sunpos);
        
        
        
float4 sunc=float4(0,0,0,0);
        if(
grad>0.998){sunc=float4(1,0,0,0);}
        
//**********************************
              
float3 ntexcoor=normalize(input.viewVec.xyz);
        
float leng=length(ntexcoor.xz);
            
        
float2 textcoor ntexcoor.xz*(1.4-ntexcoor.y)+0.03*float2(time,time);
                
//**********************************
        //читаю из текстуры облакаж
        
float4 cloud=pow(1.35*tex2D(diffuseSampler,textcoor),4);
        
float mixfactor=2*frac(time/50);
        if(
mixfactor<=1){red=0.7*lerp(cloud.x,cloud.y,mixfactor);}
        if(
mixfactor>1){red=0.7*lerp(cloud.x,cloud.y,2-mixfactor);}

        if(
leng>0.949){red=lerp(1,red,20*(0.999-leng));}
        if(
leng>0.999){red=1;}
        
float4 cloud1=float4(1,1,1,1)-min(float4(red,red,red,0),diffuse);
        
        
        
        
float4 result=max(cloud1,diffuse);
        
// возвращаем результирующий цвет пиксела
        
return result+2*sunc;
(
output.viewVec=input.position;)


Прикольные текстурные координаты создающие впечатление плоскости при рисовании на сфере.

moka 11.12.2011 01:15

Ответ: Странное.
 
Там странный переход заметен, угол такой..

dsd 11.12.2011 21:33

Ответ: Странное.
 
Там градиент неба рисовался исходя из абсолютной высоты на меше, а не как следует.


Первая попытка внедрения менталрэйвских кусков шейдера в мое творение.

Код:

// пиксельный шейдер
float4 PSMain(VSOutput input) : COLOR0
{
                float3 ntexcoor=normalize(input.viewVec.xyz);
                float height=pow((ntexcoor.y),2);
                //цвет у горизонта 150 179 209
                //цвет в зените 66 88 135
                float red=(150-84*height)/255;
                float green=(179-91*height)/255;
                float blue=(209-74*height)/255;
                float4 diffuse =float4(red,green,blue,1);
       
               
                float leng=length(ntexcoor.xz);
                float2 textcoor = ntexcoor.xz*(1.5-ntexcoor.y)+0.01*float2(time,time);
                //читаю из текстуры облакаж
                float4 cloud=pow(1.3*tex2D(diffuseSampler,textcoor),4);
                float mixfactor=pow(abs(sin(time/20.0)),3);
                red=lerp(cloud.x,cloud.y,mixfactor);
                float4 cloud1=float4(1,1,1,1)-abs(min(float4(red,red,red,red),diffuse));
                if(leng>0.949){cloud1=lerp(0,cloud1,20*(0.999-leng));}
                cloud1=pow(cloud1,4.07);
                if(cloud1.r>cloud1.g+cloud1.b){cloud1.r=cloud1.g;}
                cloud1.r=cloud1.b;
                cloud1.g=cloud1.b;

                float4 result=lerp(diffuse,sqrt(cloud1),pow(cloud1.r,4));


                //the sun
                float3 sunpos=lightDirection;
                float3 pos=normalize(input.viewVec.xyz);
                float grad=dot(pos,-sunpos);
                float4 sunc=float4(0,0,0,0);
                if(grad>0.998){sunc=float4(1,0,0,0);}
               
                //injection of be cool shader
          // Be Cool
                  float a = acos(grad);
                  float r = 150*(1-grad);
               
                  float b = 1.9 * sin(8.0 * r - time - 2.0 * a);
                  b = 0.3125 / r + cos(7.0 * a + b * b) / (100.0 * r);
                  b *= smoothstep(0.2, 0.8, b);
               
                  sunc = float4(b, 0.67 * b + 0.1 * sin(a + time), 0.0, 1.0);
                // возвращаем результирующий цвет пиксела
                return result+2*sunc;
}

А также починил чудовищно разноцветные края облачков и еще кой-чо.

dsd 11.12.2011 21:50

Ответ: Странное.
 

Только солнце :) Теперь края почти запустились :)


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

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