|
20.10.2009, 00:48
|
#16
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
ну скрин даже для реалтайм рендера не крут
|
(Offline)
|
|
20.10.2009, 08:16
|
#17
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
Добавлен новый скрин,глобал иллюминижон.
|
(Offline)
|
|
20.10.2009, 12:04
|
#18
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
вот это уже симпатично, токо вокруг черной миски какой-то внизу будто вообще света нет.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.10.2009, 14:31
|
#19
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: 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.
Щас после переведения трейсера на шейдеры буду доделывать мультисеймплинг(анти альясинг).
|
(Offline)
|
|
22.10.2009, 01:55
|
#20
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
Решил отцепить рейтрейсер от двига ну чтобы там например можно было написать для макса експортёр .
Собсна на си это дело вглядит так на данный момент:
#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");
}
|
(Offline)
|
|
22.10.2009, 18:31
|
#21
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
Сегодня тестил отрисовку в отдельном новом рей трейсере,рендерил меш 140 тысяч полигонов( тачка Lamb Diablo и плейн максовский ).
Собсно:
Разрешение: 512x512
АнтиАльясинг:1
ФПС:4-8
Вполне быстро на мой взгляд,ну естествено всё это дело рендерилось без эффектов,но 140000 поликов и 8 фпс это вполне думаю с эффектами хоть и оффлайно будет рисоватся быстро.
|
(Offline)
|
|
22.10.2009, 23:11
|
#22
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: 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;
}
};
|
(Offline)
|
|
23.10.2009, 01:49
|
#23
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
Первый скрин нового рей трейсера,с использованием более брутального шейдера .
Код шейдера:
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;
}
};
|
(Offline)
|
|
23.10.2009, 16:24
|
#24
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
Вот другую модельку заюзал:
|
(Offline)
|
|
24.10.2009, 04:25
|
#25
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
Закончил шейдер Ambient Occlusion:
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.10.2009, 04:29
|
#26
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
Вот блин,надо было для показа с анти альясингом и большим числом сеймплов делать)),щас попрравлю.
|
(Offline)
|
|
24.10.2009, 06:14
|
#27
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
Вот более в качественом виде:
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Igor' за это полезное сообщение:
|
|
24.10.2009, 13:12
|
#28
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
гуд.
|
(Offline)
|
|
24.10.2009, 16:01
|
#29
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
Взялся всеми руками на ногами за CUDA,перевожу самы хавающие вещи на неё,вернее буду,пока полько разбераюсь архитектурой.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.10.2009, 20:06
|
#30
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: BurnFX RayTracer - W.I.P
Как вам такая табличка?:
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Igor' за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:02.
|