forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   Exotic Engine (http://forum.boolean.name/showthread.php?t=11826)

Igor' 02.02.2010 02:52

Exotic Engine
 
Вложений: 1
Привецтвую!

Учавствую на даный момент в разработке MMORPG,лид программером клиента,так получилось что сначало хотели юзать Leadwerks Engine для отрисовки графики,но всплыло много камней,ришил писать свой движок,пишу не только для проекта,движок будет общедоступным и фриварным,кроссплатформеным,юзаю OOP,но функционал планирую как в Leadwerks Engine,так же будет CAPI,тобиш функции.

Пока движок в начальной стадии,умеет проигрывать звук( юзается OpenAL, проигрывается mp3,wav,ogg,потдержка стримминга ),работа с гуи( через MyGUI ),и из 3д графики пока только работа с мешами,и шейдерами( через Cg ),и текстурками,так же работа с MRT через FrameBuffer Objects.

В планах,потдержка OpenCL,Deferred Renderer,физики через Newton.

Код:

void main(){

        Engine* engine = new Engine();


        // Инициализация
        engine->init(800,600);

        // Создаем мир
        World* world = engine->createWorld();

        Camera* camera = engine->createCamera();
        camera->setLocalPosition(float3(0.0,0.0,-4));

        Texture* colorMap = engine->loadTexture("color_map.dds");
        Texture* normalMap = engine->loadTexture("normal_map.dds");

        Material* material = new Material();
        material->setTexture( 0 , colorMap );
        material->setTexture( 1 , normalMap );
        material->setShader( engine->loadShader("mesh_vertex.cg","mesh_textured_bump_pixel.cg",0) );

        Mesh* cube = MeshUtil::getInstance().createCube();//createCube(material);
        cube->paint(material);
        cube->updateTangents();
        cube->updateBounds();
        //cube->scaleMesh( float3(1,0.1f,1) );

        cube->setLocalPosition(float3(0,0,5));
        cube->setLocalRotation(rotation(float3(0,0,0)*DEG2RAD));


        // OpenAL менеджер
        OpenAL* al = engine->getAL();

        // Грузим звук
        Sound* sound = al->createSound("industrial2.mp3",Sound::STREAM||Sound::LOOP);

        // Добавляем в список проигрываемых
        sound->play();

        while( !engine->keyHit(OIS::KC_ESCAPE) ){

                if( engine->keyHit(OIS::KC_F5) )
                        engine->makeScreenshoot();

                // очистка буффера цвета\глубины\стенцила
                engine->clear(Engine::CLEAR_COLOR|Engine::CLEAR_DEPTH,float4(0,0.2f,0.3f,1.0f),1.0f,0);
               
                cube->turn(float3(.5f,.5f,.5f));
                // рисуем мир
                engine->updateWorld(0.0f);
                engine->renderWorld(0.0f);

                // Вывод на экран
                engine->flip();
        }
        // заверщение работы движка
        engine->exit();
}


moka 02.02.2010 03:01

Ответ: HxEngine
 
Newton - давно уже не актуален. Почему он?
Удачи! Как с производительностью рендера?

ABTOMAT 02.02.2010 03:10

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

В планах,потдержка OpenCL,Deferred Renderer,физики через Newton.
Привецтвую
Ньютон уже лет пять как не рулит
Потдержка OpenCL - это серьёзно

Igor' 02.02.2010 03:10

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

Сообщение от MoKa (Сообщение 135627)
Newton - давно уже не актуален. Почему он?
Удачи! Как с производительностью рендера?

Newton - ещё как актуален,дай бог ему здаровья =)
Уж очень мне понравилась в нем система разрушений =)
Вобще ньютон развивается,единственое чего в нем нету это физики мягких тел,надеюсь что пока нету ;)

Ну рендер особо не нагружал,ещё много чего по мимо рендера надо написать.

Igor' 02.02.2010 06:13

Ответ: HxEngine
 
Вложений: 1
Попробывал сделать пост фильтер,вроде получается,пост филтер простой Black & White :)

Код:


struct Input{
  float2 texcoord : TEXCOORD0;
};

struct Output{
  float4 color : COLOR0;
};


void main( in Input In , out Output Out , uniform float4 materialColor , uniform sampler2D texture0 ){

  float saturation = .1f;
  float4 color = tex2D(texture0,In.texcoord);
  float grayscale = color.r * 0.3 + color.g * 0.59 + color.b * 0.11;
  float satgray = clamp(grayscale*(1.0-saturation),0.0,1.0);
  Out.color.x = satgray + saturation * color.x;
  Out.color.y = satgray + saturation * color.y;
  Out.color.z = satgray + saturation * color.z;
  Out.color.w = 1.0f;
}

Код:

void main(){

        Engine* engine = new Engine();


        // Инициализация
        engine->init(800,600);

        // Создаем мир
        World* world = engine->createWorld();

        Camera* camera = engine->createCamera();
        camera->setLocalPosition(float3(0.0,0.0,-4));

        Texture* colorMap = engine->loadTexture("color_map.dds");
        Texture* normalMap = engine->loadTexture("normal_map.dds");

        Material* material = new Material();
        material->setTexture( 0 , colorMap );
        material->setTexture( 1 , normalMap );
        material->setShader( engine->loadShader("mesh_vertex.cg","mesh_textured_bump_pixel.cg",0) );

        Mesh* cube = MeshUtil::getInstance().createCube();//createCube(material);
        cube->paint(material);
        cube->updateTangents();
        cube->updateBounds();
        //cube->scaleMesh( float3(1,0.1f,1) );

        cube->setLocalPosition(float3(0,0,5));
        cube->setLocalRotation(rotation(float3(0,0,0)*DEG2RAD));


        // Создаем всё для пост фильтера
        FrameBuffer* buffer = engine->createBuffer(800,600,FrameBuffer::COLOR0);
        Material* postmaterial = new Material();
        postmaterial->setDepthWrite(false);
        postmaterial->setDepthTest(false,0);
        postmaterial->setCullFace(false);
        postmaterial->setAlphaBlend(false);
        postmaterial->setAlphaTest(false,0);
        postmaterial->setTexture(0,buffer->getColorTarget(0));
        postmaterial->setShader( engine->loadShader("post_quad_vertex.cg","post_disaturation_pixel.cg",0) );


        // OpenAL менеджер
        OpenAL* al = engine->getAL();

        // Грузим звук
        Sound* sound = al->createSound("industrial2.mp3",Sound::STREAM||Sound::LOOP);

        // Добавляем в список проигрываемых
        sound->play();

        while( !engine->keyHit(OIS::KC_ESCAPE) ){

                if( engine->keyHit(OIS::KC_F5) )
                        engine->makeScreenshoot();

                // устанавливаем рендер в буффер
                engine->setFrameBuffer( buffer);

                // очистка буффера цвета\глубины\стенцила
                engine->clear(Engine::CLEAR_COLOR|Engine::CLEAR_DEPTH,float4(0,0.2f,0.3f,1.0f),1.0f,0);
               
                cube->turn(float3(.5f,.5f,.5f));
                // рисуем мир
                engine->updateWorld(0.0f);
                engine->renderWorld(0.0f);

                // устанавливаем рендер в бек буффер
                engine->setFrameBuffer(0);

                engine->clear(Engine::CLEAR_COLOR|Engine::CLEAR_DEPTH,float4(0,0.2f,0.3f,1.0f),1.0f,0);
                       
       
                // рисуем квад
                postmaterial->bind();
                PostQuad::getInstance().render();
                postmaterial->unbind();
               

                // Вывод на экран
                engine->flip();
        }
        // заверщение работы движка
        engine->exit();
}

Движок кст держит Geometry Shader, планирую сделать адаптивную тессиляцию.
Также забыл сказать,есть потдержка мультисеймплов и сжатие данных( архивы ).

IGR 02.02.2010 11:58

Ответ: HxEngine
 
а проект мморпг комерческий ??
Россия ?? Украина ??

Igor' 02.02.2010 13:41

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

Сообщение от IGR (Сообщение 135655)
а проект мморпг комерческий ??
Россия ?? Украина ??

NDA ;)

SBJoker 02.02.2010 13:47

Ответ: HxEngine
 
Т.е. первый пост не подпадает под NDA?

З.Ы, в первом посте ты рассказал больше чем тебя спросили потом.

Igor' 02.02.2010 14:35

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

Сообщение от SBJoker (Сообщение 135667)
Т.е. первый пост не подпадает под NDA?

З.Ы, в первом посте ты рассказал больше чем тебя спросили потом.

В первом посте я сказал что работаю над MMORPG,не сказал комерческий\не комерческий проект и т.д и т.п. Просто работаю с серьёзными людьми.

SBJoker 02.02.2010 14:55

Ответ: HxEngine
 
Ты непонял мой сарказм, на мой взгляд информация о том что делается какая то там ММОРПГ более важна чем в какой стране и то коммерческая ли она, потому упоминание NDA скорее позерство чем реальная необходимость.

Но если чо то мы прониклись уважением, так держать!

FDsagizi 02.02.2010 21:15

Ответ: HxEngine
 
опять Твенти файв...

Какой это по счету уже "Дви-Жек" ?

HolyDel 02.02.2010 21:57

Ответ: HxEngine
 
GAPI? Судя по контексту OpenGL (OpenAL а не DirectSound и FBO а не RTT да и Geometry Shaders наверное пока еще рано писать на DX, так как WinVista Win7 only)

сколько уже идет разработка? сколько разработчиков?

Цитата:

// очистка буффера цвета\глубины\стенцила
engine->clear(Engine::CLEAR_COLOR|Engine::CLEAR_DEPTH,flo at4(0,0.2f,0.3f,1.0f),1.0f,0);
имхо слишком низко. да и семантика кривовата по моему мнению. отчистить движек можно от загруженных ресурсов. а тут отчистка экрана (окна, полотна, фреймбуффера) и т.д.

Цитата:

engine->updateWorld(0.0f);
какой именно? все? активные?
почему не world->update(0.0f); (если в скобках твининг, то почему не 1.0?)

насчет ньютона. физдвиг без аппаратного ускорения, имхо, не нужен. пока вы напишите двиг, пока напишите игру, уже у 80% юзеров будут карточки, способные аппаратно ускорять физику (тряпки, мягкие тела, флюиды и прочие красивости).

а вообще, так держать!
очень удачен синтаксис, понятен с первого взгляда (на 95%).
буду следить за обновлениями, надеюсь все у вас получится.

Igor' 03.02.2010 03:01

Ответ: HxEngine
 
Вложений: 1
Цитата:

Сообщение от HolyDel (Сообщение 135721)
GAPI? Судя по контексту OpenGL (OpenAL а не DirectSound и FBO а не RTT да и Geometry Shaders наверное пока еще рано писать на DX, так как WinVista Win7 only)

сколько уже идет разработка? сколько разработчиков?


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


какой именно? все? активные?
почему не world->update(0.0f); (если в скобках твининг, то почему не 1.0?)

насчет ньютона. физдвиг без аппаратного ускорения, имхо, не нужен. пока вы напишите двиг, пока напишите игру, уже у 80% юзеров будут карточки, способные аппаратно ускорять физику (тряпки, мягкие тела, флюиды и прочие красивости).

а вообще, так держать!
очень удачен синтаксис, понятен с первого взгляда (на 95%).
буду следить за обновлениями, надеюсь все у вас получится.

Используется OpenGL,расширения версии 2.1.
В OpenGL есть расширение "ARB_geometry_shader".

engine->clear,для очистки текущего буффера.
engine->update\render World( deltaTime ),для очистки текущего мира,мир можно менять командой engine->setWorld.
для выгрузки всех ресурсов используется engine->exit();


Вобще есть уже первые нароботки по Deferred Renderer.
Использование DeferredRenderer:

Код:


void main(){

        Engine* engine = new Engine();


        // Инициализация
        engine->init(800,600);



        // Создаем мир
        World* world = engine->createWorld();

        engine->initDeferredRenderer();

        Camera* camera = engine->createCamera();
        camera->setLocalPosition(float3(0.0,0.0,-4));

        PointLight* point0 = engine->createPointLight();
        point0->setRange(200.0f);
        point0->setLocalPosition(float3(0,50,-30));

        Texture* colorMap = engine->loadTexture("color_map.dds");
        Texture* normalMap = engine->loadTexture("normal_map.dds");

        Material* material = new Material();
        material->setTexture( 0 , colorMap );
        material->setTexture( 1 , normalMap );
        material->setShader( engine->loadShader("mesh_vertex.cg","deferred_mesh_textured_bump_pixel.cg",0) );

        Mesh* cube = MeshUtil::getInstance().createCube();//createCube(material);
        cube->paint(material);
        cube->updateTangents();
        cube->updateBounds();
        //cube->scaleMesh( float3(1,0.1f,1) );

        cube->setLocalPosition(float3(0,0,5));
        cube->setLocalRotation(rotation(float3(0,0,0)*DEG2RAD));


        // Создаем всё для пост фильтера
        FrameBuffer* buffer = engine->createBuffer(800,600,FrameBuffer::COLOR0|FrameBuffer::COLOR1|FrameBuffer::DEPTH);


        // OpenAL менеджер
        OpenAL* al = engine->getAL();

        // Грузим звук
        Sound* sound = al->createSound("industrial2.mp3",Sound::STREAM||Sound::LOOP);

        // Добавляем в список проигрываемых
        sound->play();

        while( !engine->keyHit(OIS::KC_ESCAPE) ){

                if( engine->keyHit(OIS::KC_F5) )
                        engine->makeScreenshoot();

                // устанавливаем рендер в буффер
                engine->setFrameBuffer( buffer);
       

                // очистка буффера цвета\глубины\стенцила
                engine->clear(Engine::CLEAR_COLOR|Engine::CLEAR_DEPTH,float4(0,0.2f,0.3f,1.0f),1.0f,0);
               
                cube->turn(float3(0,.5f,0));
                // рисуем мир
                engine->updateWorld(0.0f);
                engine->renderWorld(0.0f);

                // устанавливаем рендер в бек буффер
                engine->setFrameBuffer(0);

                engine->clear(Engine::CLEAR_COLOR|Engine::CLEAR_DEPTH,float4(0,0.2f,0.3f,1.0f),1.0f,0);
                       
       
                DeferredRenderer::getInstance().render(buffer,camera,0.0f);

                // Вывод на экран
                engine->flip();
        }
        // заверщение работы движка
        engine->exit();
}

Point Light шейдер:
Код:


struct Input{
  float2 texcoord : TEXCOORD0;
};

struct Output{
  float4 color    : COLOR0;
};


void main( in Input In , out Output Out , uniform sampler2D texture0 , uniform sampler2D texture1 , uniform sampler2D texture2 , uniform float4x4 invViewProj ,  uniform float3 lightPosition , uniform float lightRange , uniform float3 cameraPosition ){

  float depth = tex2D(texture0,In.texcoord).x;
  float4 albedo = tex2D(texture1,In.texcoord);
     
  Out.color = albedo;
 
  if( depth >= 1.0f )
      return;
 

  float3 normal = tex2D(texture2,In.texcoord).xyz;
 
  // screen space coord
  float4 position;
  position.x = In.texcoord.x * 2.0f - 1.0f;
  position.y = -(In.texcoord.y * 2.0f - 1.0f);
  position.z = depth;
  position.w = 1.0f;
  position = mul( position , invViewProj );
  position /= position.w;
 
  // light vector
  float3 light_vector = normalize( lightPosition - position.xyz );
 
  // half vector
  float3 half_vector = normalize((cameraPosition - position.xyz) + (lightPosition - position.xyz));
 
  // light specular
  float specular  = 1.0f * pow(dot(half_vector,normal), 100);
 
  // light attenuation
  float attenuation = saturate(1.0f - distance(position.xyz, lightPosition) / lightRange);
 
  // final color
  Out.color = ( albedo * clamp(dot(normal,light_vector),0.0f,1.0f) ) + specular * attenuation;
}

Кст из потдерживаемых форматов текстур - tga,dds,png,jpg.

Igor' 03.02.2010 07:25

Ответ: HxEngine
 
Вобщем в DS,готовы Point\Directional источники(пока без теней),и ещё Ambient Light.
Исчу нормальную модельку для тестов пока,ибо из проекта пока низя ничего публично показывать( да и пока из моделей только персонажи ).

Igor' 04.02.2010 21:00

Ответ: HxEngine
 
Будет ешё один тип шейдеров,Compute Shader,как DirectCompute в D3D,будет работать на OpenCL.


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

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