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

wolfhound512 15.10.2011 13:32

Ответ: Xors3D
 
http://msdn.microsoft.com/en-us/libr...29(VS.85).aspx

Header Mmsystem.h (include Windows.h)
Library Winmm.lib

Winmm.lib добавил в список библиотек?

Sashka007 15.10.2011 14:50

Ответ: Xors3D
 
Добавил Winmm.lib и все нормально стало.

Sashka007 17.10.2011 19:47

Ответ: Xors3D
 
В чем может быть проблема? Почему map не показывается? А если убрать xHideEntity(back_map), то показывается весь back_map, на блице все нормально работает.

int back_map = xLoadAnimMesh("DATA/models/map/map.b3d");
int map = xFindChild(back_map,"Plane02");
xEntityType(map,col_map);
xHideEntity(back_map);

SBJoker 17.10.2011 19:53

Ответ: Xors3D
 
Цитата:

Сообщение от Sashka007 (Сообщение 206160)
В чем может быть проблема? Почему map не показывается? А если убрать xHideEntity(back_map), то показывается весь back_map, на блице все нормально работает.

int back_map = xLoadAnimMesh("DATA/models/map/map.b3d");
int map = xFindChild(back_map,"Plane02");
xEntityType(map,col_map);
xHideEntity(back_map);

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

скрыл загруженную модель

Очевидно в результате работы программы мы не увидим модель, что не так?

Sashka007 17.10.2011 19:59

Ответ: Xors3D
 
вот: http://narod.ru/disk/28688556001/Game.rar.html


Вот почему-то найденый чайлд мы не видим.

RBK 17.10.2011 22:06

Ответ: Xors3D
 
Все правильно xHideEntity скрывает указанный объект, и все привязанные к нему.

pozitiffcat 24.10.2011 17:06

Ответ: Xors3D
 
есть у кого шейдер, для создания мультяшной графики, рисованной. Вроде технология cell-shading называется... ???

dsd 24.10.2011 17:16

Ответ: Xors3D
 
Тебе нужно в зависимости от угла между нормалью и вектором соединяющим пиксель и камеру красить каким-либо цветом пиксель. Он простой сам по себе шейдер.
Вообще в архиве с хорсом в сэмплах идет ToonShaded Light. Ну можно еще с бесшовной текстурой как-нить по диагонали типа карандашом заштрихованную в какой-то пропорции смешивать. И постэффектом маской все контуры зубчатыми делать.


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


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

// Light
const float4 AmbientClr; // Ambient Color
const float4 LightClr; // Light Color
const float4 CountourClr; // Contour Color
const half CountourWidth; // Contour Width

// Positions
float4 PosLight; // Light Position
float RngLight; // Light Range
float4 PosCam; // Camera Position

// Other
static float4 Color;
static float cTS;

static float nLight;
static float nCam;



//################## Textures ##################
const texture tToonGradient; // Toon Gradient Texture
sampler1D TexToonGradient=sampler_state {
Texture = <tToonGradient>;
ADDRESSU = CLAMP;
ADDRESSV = CLAMP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
MIPFILTER = LINEAR;
};


//################## Input VS ##################
struct sv_N {
float4 Position : POSITION0;
float3 Normal : NORMAL;
};
//################## Output VS ##################
struct sp_PW_N {
float4 Position : POSITION0;
float4 pWorld : TEXCOORD0;
float3 Normal : TEXCOORD1;
};


//################## VS ##################
void vs_PW_N( in sv_N IN, out sp_PW_N OUT ) {
OUT.Position = mul(IN.Position,MatWorldViewProj);
OUT.pWorld = mul(IN.Position,MatWorld);
OUT.Normal = normalize(mul(IN.Normal,MatWorld));
}

//################## PS ##################
float4 psDirectional( in sp_PW_N IN ) : COLOR {
PosLight = normalize(PosLight);
PosCam = normalize(PosCam-IN.pWorld);

nLight = saturate(dot(PosLight,IN.Normal));
nCam = normalize(dot(PosCam,IN.Normal)-CountourWidth);

cTS = tex1D(TexToonGradient,nLight).r;

Color = (AmbientClr*(1.0f-cTS)+(cTS*LightClr))*nCam+((1.0f-nCam)*CountourClr);

return float4(Color.rgb,1.0f);
}

float4 psPoint( in sp_PW_N IN ) : COLOR {
PosLight = normalize(PosLight-IN.pWorld);
PosCam = normalize(PosCam-IN.pWorld);

nLight = saturate(dot(PosLight,IN.Normal));
nCam = normalize(dot(PosCam,IN.Normal)-CountourWidth);

cTS = tex1D(TexToonGradient,nLight).r;

Color = (AmbientClr*(1.0f-cTS)+(cTS*LightClr))*nCam+((1.0f-nCam)*CountourClr);

return float4(Color.rgb,1.0f);
}

float4 psPointDistance( in sp_PW_N IN ) : COLOR {
RngLight = saturate(1.0f-(distance(IN.pWorld,PosLight)/RngLight));
if (RngLight>0.0f) {
PosLight = normalize(PosLight-IN.pWorld);

nLight = saturate(dot(PosLight,IN.Normal)*pow(RngLight,.1)) ;

cTS = tex1D(TexToonGradient,nLight).r;

Color = AmbientClr*(1.0f-cTS)+(cTS*LightClr);
} else {
Color = AmbientClr;
}

PosCam = normalize(PosCam-IN.pWorld);
nCam = normalize(dot(PosCam,IN.Normal)-CountourWidth);

Color = Color*nCam+(1.0f-nCam)*CountourClr;

return float4(Color.rgb,1.0f);
}


//################## Technique ##################
technique Directional {
pass p0 {
AlphaBlendEnable= false;
vertexshader = compile vs_2_0 vs_PW_N();
pixelshader = compile ps_2_0 psDirectional();
}
}
technique Point {
pass p0 {
AlphaBlendEnable= false;
vertexshader = compile vs_2_0 vs_PW_N();
pixelshader = compile ps_2_0 psPoint();
}
}
technique PointDistance {
pass p0 {
AlphaBlendEnable= false;
vertexshader = compile vs_2_0 vs_PW_N();
pixelshader = compile ps_2_0 psPointDistance();
}
}

pozitiffcat 25.10.2011 10:24

Ответ: Xors3D
 
у меня объект b3d состоит из множества мешей, следовательно там куча тестур. Как мне это обработать, тем более что модель анимационная. И когда я накладываю шейдер, она теряет текстуру

dsd 25.10.2011 10:49

Ответ: Xors3D
 
Накладывать на каждый меш шейдер отдельно и передавать в шейдер соответствующую текстуру
xSetEntityEffect(mesh,Shader);
xSetEffectTexture(mesh,"seaside",seaside_tex);

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

pozitiffcat 25.10.2011 11:58

Ответ: Xors3D
 
Цитата:

Сообщение от dsd (Сообщение 206856)
Накладывать на каждый меш шейдер отдельно и передавать в шейдер соответствующую текстуру
xSetEntityEffect(mesh,Shader);
xSetEffectTexture(mesh,"seaside",seaside_tex);

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

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

HolyDel 25.10.2011 12:26

Ответ: Xors3D
 
Цитата:

Как вот мне узнать что этот пиксел крайний и его нужно нарисовать черным?
для честного outlining-а нужен SM 4

pozitiffcat 25.10.2011 12:49

Ответ: Xors3D
 
Цитата:

Сообщение от HolyDel (Сообщение 206867)
для честного outlining-а нужен SM 4

это еще че такое

SBJoker 25.10.2011 12:51

Ответ: Xors3D
 
ShaderModel 4 / Шейдеры четвертой версии

dsd 25.10.2011 13:03

Ответ: Xors3D
 
Ну если в кратце и врать, то.

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

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

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

И по сути он работает уже не с моделью, а только с одним ее треугольником. Из вершинного шейдера ты передал текстурные координаты вершинам треугольника и командой sampler2d() можешь приказать шейдеру из какой текстуры узнать какая точкой той текстуры попадает в это место. Это есть наш цвет с которым мы должны работать дальше.

Еще в вершинном шейдере мы подготовливаем данные о нормали поверхности. Которые магическим образом передаются в текущий пиксель. Еще мы можем в шейдер этакой глобальной переменной передать вектор вдоль которого светит свет.
Дальше командой normalize() можно сделать векторы нормали и направления света длинной 1. И есть команда dot() скалярное произведение векторов. Котрая при нормализации входных векторов вернет косинус угла между ними.

И вот тут происходит магия. У нас есть из сэмплера цвет пикселя от текстуры. Есть косинус угла между нормалью и повернутым обратно светом, этот косинус является той. Частью света которую отразит наш пиксель прямо нам в глаз. Перемножаем вектор цвета но косинус получаем четырехмерный вектор цвета который и есть наш пиксель для которого посчитан правильный цвет и затенение.
сорри за мой хранйцузский акцент, пишу с мобилы.


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

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