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)

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
 
Как вам такая табличка?:


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

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