forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   BurnFX RayTracer - W.I.P (http://forum.boolean.name/showthread.php?t=9540)

Igor' 18.10.2009 11:58

BurnFX RayTracer - W.I.P
 
BurnFX RayTracer Work In Process

Возможности(текущие):
1) Ambient Occlusion
2) Direct\Indirect Illumination( GI via Photon Mapping )
3) Normal Mapping
4) Reflection\Refraction
5) Transparency

Скрины:










Тут канечно до всяких там MentalRay,VRay далеко,но уже есть на что взглянуть =)

ІГРОГРАЙКО 18.10.2009 23:01

Ответ: BurnFX RayTracer - W.I.P
 
Ухты! Ето ты на С++ накодил? И свой двиг графический написал? Direct?

Mr_F_ 18.10.2009 23:34

Ответ: BurnFX RayTracer - W.I.P
 
ничаво так

под маской игоря кроется genius? :)


тонны рефлекшена не дают толком разглядеть освещение

ABTOMAT 19.10.2009 00:11

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

Сообщение от Mr_F_ (Сообщение 121897)
под маской игоря кроется genius? :)

Угу.

Igor' 19.10.2009 10:19

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

Сообщение от ІГРОГРАЙКО (Сообщение 121894)
Ухты! Ето ты на С++ накодил? И свой двиг графический написал? Direct?

А чего в этом сложного? Даже на Blitz3D можно такое же написать...

З.Ы. Буду со временем пополнять первый пост скринами.

Нашол на википедии показатели приломления( http://ru.wikipedia.org/wiki/Коэффициент_преломления ) ща подумываю сделать каустику.

ІГРОГРАЙКО 19.10.2009 10:35

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

Сообщение от Igor' (Сообщение 121912)
А чего в этом сложного? Даже на Blitz3D можно такое же написать...

ШОТО Я СОМНЕВАЮСЬ:rolleyes:
Но ты же на С++ писал, иначе ты бы здесь ето не выкладывал...
Круто...

Я тоже теперь понемножку на С++ переходжу... Blitz3D SDK а потом Xors3D возьму, но пока комп не тянет:-)

jimon 19.10.2009 13:16

Ответ: BurnFX RayTracer - W.I.P
 
ІГРОГРАЙКО
там картинка рисуется 2-5 минут на 1 кадр, думаю вполне возможно написать на блиц3д такое, но работать будет намного медленнее

Igor' 19.10.2009 16:07

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

Сообщение от jimon (Сообщение 121921)
ІГРОГРАЙКО
там картинка рисуется 2-5 минут на 1 кадр, думаю вполне возможно написать на блиц3д такое, но работать будет намного медленнее

А что думать? Есть возможно трасировки лучей,есть возможность записи в картику,всё возможно.

Для трасировки лучей из камеры можно юзать CameraPick,для отражений и т.д LinePick...

IGR 19.10.2009 16:12

Ответ: BurnFX RayTracer - W.I.P
 
новая тема, новый двиг ?? или как ??

Цитата:

там картинка рисуется 2-5 минут на 1 кадр, думаю вполне возможно написать на блиц3д такое, но работать будет намного медленнее
да-да... какой фпс ?? :-D

Igor' 19.10.2009 16:30

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

Сообщение от IGR (Сообщение 121932)
новая тема, новый двиг ?? или как ??


да-да... какой фпс ?? :-D

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

Mr_F_ 19.10.2009 17:50

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

да-да... какой фпс ??
это оффлайн рендер.

Игорь, кстати насчёт АО - чет туплю, как не в скринспейсе делают?) откуда лучи полусферой пускают? чуть_поодаль_от точки, на которую рассчитывается свет? вроде так не покатит

Igor' 19.10.2009 18:13

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

Сообщение от Mr_F_ (Сообщение 121936)
это оффлайн рендер.

Игорь, кстати насчёт АО - чет туплю, как не в скринспейсе делают?) откуда лучи полусферой пускают? чуть_поодаль_от точки, на которую рассчитывается свет? вроде так не покатит

Ну допустим в Per Vertex,пускают из каждого вертекса луч,если есть лайтмеп то из каждой точки.

Направление луча вычисляется так(в цикле типа for( int i=0;i< samples;i++ )):

Код:


                      vec3 dir;
                do{
                        dir = vec3( -1.0f + (float)genrand_real12()*2.0f , -1.0f + (float)genrand_real12()*2.0f , -1.0f + (float)genrand_real12()*2.0f );
                }while( !(dir.length() <= 1.0f) );
                dir.normalize();

                float d = dot(hit.normal, dir);
        if (d < 0)
                {
                        dir = dir - d * 2.0f;
                        dir = dir % hit.normal;
                }


Mr_F_ 19.10.2009 19:18

Ответ: BurnFX RayTracer - W.I.P
 
АА тфу, они же ИЗ точки пускаются а не както вокруг неё, вот я туплю)

Igor' 19.10.2009 21:34

Ответ: BurnFX RayTracer - W.I.P
 
В превый пост добавлен новый скрин.

IGR 19.10.2009 21:43

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

В превый пост добавлен новый скрин.
о, секси !! :-D

Mr_F_ 20.10.2009 00:48

Ответ: BurnFX RayTracer - W.I.P
 
ну скрин даже для реалтайм рендера не крут

Igor' 20.10.2009 08:16

Ответ: BurnFX RayTracer - W.I.P
 
Добавлен новый скрин,глобал иллюминижон.

Mr_F_ 20.10.2009 12:04

Ответ: BurnFX RayTracer - W.I.P
 
вот это уже симпатично, токо вокруг черной миски какой-то внизу будто вообще света нет.

Igor' 21.10.2009 14:31

Ответ: BurnFX RayTracer - W.I.P
 
Решил сегодня в рейтрейсере ввести шейдеры,тоесть имеем такое:

Код:

class CTestRayShader : public IRayShader
{
public:

        CTestRayShader(){
        }

        vec3 main( const RayHit& hit ){
                float3 final = float3(0,0,0);
                float3 diffuse = hit.material->getColor();
                float3 base = tex2D(hit.material , float2(hit.u,hit.v) , 0);
                final = diffuse * base;
                return final;
        }
};

Возможностей много(шейдеры пишутся на C++) название типов как в HLSL.

tex2D пердставлена в таком виде:

float4 tex2D( IMaterial* material , const float2& texcoord , int samplerIndex )

первый параметр - матереал
второй - текстурные координаты
третий - индекс семплера(текстуры) в матереале

будут и tex3D,texCUBE.

Щас после переведения трейсера на шейдеры буду доделывать мультисеймплинг(анти альясинг).

Igor' 22.10.2009 01:55

Ответ: BurnFX RayTracer - W.I.P
 
Решил отцепить рейтрейсер от двига ну чтобы там например можно было написать для макса експортёр :rolleyes: .

Собсна на си это дело вглядит так на данный момент:

Код:

#include "..\BurnRay\sdk.h"

using namespace BurnRay;


class TestShader : public Shader
{
public:

        TestShader(){
        }

        float3 main( const RayHit& hit )
        {
                return hit.material->getColor();
        }
};


void main()
{

        FrameBuffer* framebuffer = new FrameBuffer(256,256);
    Renderer* renderer = new Renderer();
        renderer->setFrameBuffer(framebuffer);

        Material* material = new Material();
        material->setShader(new TestShader());
        material->setColor(float3(1,0,0));

        ObjectSphere* sphere = new ObjectSphere();
        sphere->setMaterial(material,0);
        sphere->setPosition(vec3(0,0,25));
        sphere->setRadius(10.4f);

        ObjectSphere* sphere2 = new ObjectSphere();
        sphere2->setMaterial(material,0);
        sphere2->setPosition(vec3(15,0,25));
        sphere2->setRadius(10.4f);

    ObjectSphere* sphere3 = new ObjectSphere();
        sphere3->setMaterial(material,0);
        sphere3->setPosition(vec3(-15,0,25));
        sphere3->setRadius(10.4f);

        ObjectSphere* sphere4 = new ObjectSphere();
        sphere4->setMaterial(material,0);
        sphere4->setPosition(vec3(0,0,45));
        sphere4->setRadius(10.4f);


        ObjectCamera* camera = new ObjectCamera();
        camera->setAspect(256.0f / 256.0f);
        camera->setPosition(vec3(0,0,0));
        camera->setFar(1024.0f);
        camera->setNear(1.0f);
        camera->setFov(89.0f);


        renderer->addObject(sphere);
        renderer->addObject(sphere2);
        renderer->addObject(sphere3);
        renderer->addObject(sphere4);

        renderer->renderFrame(camera,1);

        //float3* frame = framebuffer->getPixels();

        Image* img = new Image(framebuffer->getWidth(),framebuffer->getHeight());
        for(int y=0;y<framebuffer->getHeight();y++){
                for(int x=0;x<framebuffer->getWidth();x++){

                        Image::Pixel p;
                        p.r = framebuffer->getPixel(x,y).x * 255.0f;
                        p.g = framebuffer->getPixel(x,y).y * 255.0f;
                        p.b = framebuffer->getPixel(x,y).z * 255.0f;
            p.a = 255.0f;

                        img->put(x,y,p);
                }
        }
        img->save("out.tga");
}


Igor' 22.10.2009 18:31

Ответ: BurnFX RayTracer - W.I.P
 
Сегодня тестил отрисовку в отдельном новом рей трейсере,рендерил меш 140 тысяч полигонов( тачка Lamb Diablo и плейн максовский ).

Собсно:
Разрешение: 512x512
АнтиАльясинг:1
ФПС:4-8

Вполне быстро на мой взгляд,ну естествено всё это дело рендерилось без эффектов,но 140000 поликов и 8 фпс это вполне думаю с эффектами хоть и оффлайно будет рисоватся быстро.

Igor' 22.10.2009 23:11

Ответ: BurnFX RayTracer - W.I.P
 
Первый более менее шейдер написал :),отражения,всё работает.

Код:

class Reflectionhader : public Shader
{
public:

        ReflectionShader(){
        }

        float3 shader_main( const Ray& ray , const RayHit& hit , void* data )
        {
                int bounces = 2;

                if(data){
                        bounces = *static_cast<int*>(data);
                }

                float3 base = hit.material->getColor();

                if(bounces > 0 && hit.material->getReflective() > 0.0f ){
                        bounces--;

                        Ray r;
                        r.o = hit.point + ( hit.normal * 1.01f );
                        r.d = ray.d.reflect(hit.normal);

                        RayHit hit2;
                        hit2.empty();

                        if(rayCast(r,hit2,10000.0f)){
                                base = base * ( 1.0f - hit.material->getReflective() ) + hit2.material->getShader()->shader_main(r,hit2,&bounces) * hit.material->getReflective();
                        }
                }

                return base;
        }
};


Igor' 23.10.2009 01:49

Ответ: BurnFX RayTracer - W.I.P
 
Первый скрин нового рей трейсера,с использованием более брутального шейдера :-D.



Код шейдера:
Код:

class ReflectionShader : public Shader
{
public:

        ReflectionShader(){
        }

        float3 shader_main( const Ray& ray , const RayHit& hit , void* data )
        {
                int bounces = 2;

                if(data){
                        bounces = *static_cast<int*>(data);
                }

                float3 base = hit.material->getColor();

                float3 accum = float3(0,0,0);
                for(int i=0;i<getRenderer()->getNumLights();i++)
                {
                        ObjectLight* light = getRenderer()->getLight(i);
                        float3 l = light->getPosition() - hit.point;
                        float dist = length(l);
                        l = normalize( l );

                        Ray shadowRay;
                        shadowRay.o = hit.point + ( hit.normal * 1.01f );
                        shadowRay.d = l;

                        RayHit hit2;
                        hit2.empty();

                        float shade = 1.0f;

                        if(light->getCastShadows()){
                                if(light->getShadowSamples() <= 0){
                                        if(rayCast(shadowRay,hit2,dist))
                                                shade = 0.0f;
                                }else{

                                        for(int i=0;i<light->getShadowSamples();i++){
                                                shadowRay.d = shadowRay.d + normalize(float3(randf(),randf(),randf()));
                                       
                                                if(rayCast(shadowRay,hit2,dist))
                                                        shade -= 0.1f;
                                        }

                                        if(shade < 0.0f)
                                                shade = 0.0f;
                                }
                        }

                        float d = dot(hit.normal,l);
                        if(d > 0.0f){
 
                                float attenuation = 1 - sqrt(dist) / sqrt(light->getRadius());

                                accum += light->getColor() * d * attenuation * shade;
                        }

                        if(hit.material->getSpecularPower() > 0.0f){

                                float3 v = ray.d;
                                float3 r = l - 2.0f * dot( l, hit.normal ) * hit.normal;
                                float d = dot( v, r );
                                if(d > 0.0f){
                                        float spec = powf( d , 2 ) * hit.material->getSpecularPower() * shade;
                                        accum += float3(spec) * light->getColor();
                                }
                        }
                }
                base *= accum;

                if(bounces > 0 && hit.material->getReflective() > 0.0f ){
                        bounces--;

                        Ray r;
                        r.o = hit.point + ( hit.normal * 1.01f );
                        r.d = ray.d.reflect(hit.normal);

                        RayHit hit2;
                        hit2.empty();

                        if(rayCast(r,hit2,10000.0f)){
                                base = base * ( 1.0f - hit.material->getReflective() ) + hit2.material->getShader()->shader_main(r,hit2,&bounces) * hit.material->getReflective();
                        }
                }

                return base;
        }
};


Igor' 23.10.2009 16:24

Ответ: BurnFX RayTracer - W.I.P
 
Вот другую модельку заюзал:

Igor' 24.10.2009 04:25

Ответ: BurnFX RayTracer - W.I.P
 
Закончил шейдер Ambient Occlusion:

Igor' 24.10.2009 04:29

Ответ: BurnFX RayTracer - W.I.P
 
Вот блин,надо было для показа с анти альясингом и большим числом сеймплов делать)),щас попрравлю.

Igor' 24.10.2009 06:14

Ответ: BurnFX RayTracer - W.I.P
 
Вот более в качественом виде:

Mr_F_ 24.10.2009 13:12

Ответ: BurnFX RayTracer - W.I.P
 
гуд.

Igor' 24.10.2009 16:01

Ответ: BurnFX RayTracer - W.I.P
 
Взялся всеми руками на ногами за CUDA,перевожу самы хавающие вещи на неё,вернее буду,пока полько разбераюсь архитектурой.

Igor' 24.10.2009 20:06

Ответ: BurnFX RayTracer - W.I.P
 
Как вам такая табличка?:

jimon 24.10.2009 20:08

Ответ: BurnFX RayTracer - W.I.P
 
Igor'
может для блога разработки использовать отдельный сайт ?

Igor' 24.10.2009 20:34

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

Сообщение от jimon (Сообщение 122309)
Igor'
может для блога разработки использовать отдельный сайт ?

Э,я незнал что комуто мешаю...

jimon 24.10.2009 21:04

Ответ: BurnFX RayTracer - W.I.P
 
Igor'
ты не мешаешь, просто форум это не блог и не чат, если тебе есть о чём сказать то сначала сформулируй мысль, а то у тебя "новость" о какой-то мелочи расползается на 3-5 постов, такое поведение сравнимо с простым набиванием постов :)

да, и не забывай о существовании кнопки редактирования :)

Mr_F_ 24.10.2009 21:26

Ответ: BurnFX RayTracer - W.I.P
 
да лан, норм новости)

Igor' 25.10.2009 14:04

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

Сообщение от jimon (Сообщение 122313)
Igor'
ты не мешаешь, просто форум это не блог и не чат, если тебе есть о чём сказать то сначала сформулируй мысль, а то у тебя "новость" о какой-то мелочи расползается на 3-5 постов, такое поведение сравнимо с простым набиванием постов :)

да, и не забывай о существовании кнопки редактирования :)

Cмысл мне набивать посты?
За это что премию какуюто дают?

Mr_F_ 25.10.2009 14:29

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

да, и не забывай о существовании кнопки редактирования
не, тогда никто не увидит апдейты в новых сообщениях

Igor' 25.10.2009 22:19

Ответ: BurnFX RayTracer - W.I.P
 
Демка - http://ifolder.ru/14673281
Проверка на предмет работаспособности :)

Igor' 27.10.2009 16:12

Ответ: BurnFX RayTracer - W.I.P
 
Cделал Indirect Illumination шейдер,с использованием фотоных карт.
Скрин:

Igor' 01.11.2009 06:05

Ответ: BurnFX RayTracer - W.I.P
 
Cornell Box - Ambient Occlusion + Indirect Illumination,без Direct Illumination.

jimon 01.11.2009 13:04

Ответ: BurnFX RayTracer - W.I.P
 
Igor'
всё же ты опять не добиваешься качества, просто навешивая кучу технологий и получается опять какашка

во-первых шумы AO на рёбрах объектов, пока от них не избавишься то нельзя тебе говорить что AO ты сделал

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

дальний кубик похоже что выцвел, попробуй ввести экспозицию

Igor' 01.11.2009 17:27

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

Сообщение от jimon (Сообщение 123075)
Igor'
во-первых шумы AO на рёбрах объектов, пока от них не избавишься то нельзя тебе говорить что AO ты сделал

http://i.imagehost.org/view/0291/out
Аднако не правда.
Цитата:

Сообщение от jimon (Сообщение 123075)
Igor'
во-вторых опять на глаз лезет какой-то блюр текстур, попробуй засунь простую шахматную текстуру чтобы видеть что ничего не смазывается

дальний кубик похоже что выцвел, попробуй ввести экспозицию

К твоему сведению это тебе не растаризатор,и всяких штук типа мип меппинга нету.

Igor' 01.11.2009 17:37

Ответ: BurnFX RayTracer - W.I.P
 
Вот ещё мидл поли мопед:


С гамма коррекцией:

Mr_F_ 01.11.2009 19:13

Ответ: BurnFX RayTracer - W.I.P
 
как я понимаю это не оригинальный АОшный шум в корнелл боксе, а искажение дурацким мелким бампом его.

Igor' 01.11.2009 21:00

Ответ: BurnFX RayTracer - W.I.P
 
Цитата:

Сообщение от Mr_F_ (Сообщение 123089)
как я понимаю это не оригинальный АОшный шум в корнелл боксе, а искажение дурацким мелким бампом его.

Ну тут не только бамп там ещё просто мало сеймплов юзалось для расчёта AO.

Igor' 02.11.2009 04:09

Ответ: BurnFX RayTracer - W.I.P
 
Сделал таки работу с кубмапами,скрин:


Щай думаю как лучше сделать потдержку hdr текстур...

Ах да ввёл такую штуку как Background,пока есть два типа бекграундов:
1) Колор(Просто цвет)
2) Кубмап( Текстурa кубмап,тобиш скай бокс можно сделать)

Можно также делать свои типы бекграундов.

Пример работы с кубмап бекграундом:
Код:

        Texture* sky = new Texture();
        Image* pos_x = new Image();
        pos_x->load("media/alpleft.tga");
        Image* pos_y = new Image();
        pos_y->load("media/alpup.tga");
        Image* pos_z = new Image();
        pos_z->load("media/alpforward.tga");
        Image* neg_x = new Image();
        neg_x->load("media/alpright.tga");
        Image* neg_y = new Image();
        neg_y->load("media/alpdown.tga");
        Image* neg_z = new Image();
        neg_z->load("media/alpback.tga");
        sky->setFace(pos_x,Texture::POSITIVE_X);
        sky->setFace(pos_y,Texture::POSITIVE_Y);
        sky->setFace(pos_z,Texture::POSITIVE_Z);
        sky->setFace(neg_x,Texture::NEGATIVE_X);
        sky->setFace(neg_y,Texture::NEGATIVE_Y);
        sky->setFace(neg_z,Texture::NEGATIVE_Z);

        CubeMapBackground* background = new CubeMapBackground();
        background->setCubeMap(sky);
        renderer->setBackground(background);


Igor' 04.11.2009 20:26

Ответ: BurnFX RayTracer - W.I.P
 
BurnRay на SourceForge.net - http://sourceforge.net/projects/bray/


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

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