资源简介
实现光线跟踪算法,构造一个虚拟场景。
代码片段和文件信息
// -----------------------------------------------------------
// raytracer.cpp
// 2004 - Jacco Bikker - jacco@bik5.com - www.bik5.com - <><
// -----------------------------------------------------------
#include “raytracer.h“
#include “scene.h“
#include “common.h“
#include “windows.h“
#include “winbase.h“
namespace Raytracer {
Ray::Ray( vector3& a_Origin vector3& a_Dir ) :
m_Origin( a_Origin )
m_Direction( a_Dir )
{
}
Engine::Engine()
{
m_Scene = new Scene();
}
Engine::~Engine()
{
delete m_Scene;
}
// -----------------------------------------------------------
// Engine::SetTarget
// Sets the render target canvas
// -----------------------------------------------------------
void Engine::SetTarget( Pixel* a_Dest int a_Width int a_Height )
{
// set pixel buffer address & size
m_Dest = a_Dest;
m_Width = a_Width;
m_Height = a_Height;
}
// -----------------------------------------------------------
// Engine::Raytrace
// Naive ray tracing: Intersects the ray with every primitive
// in the scene to determine the closest intersection
// -----------------------------------------------------------
Primitive* Engine::Raytrace( Ray& a_Ray Color& a_Acc int a_Depth float a_RIndex float& a_Dist )
{
if (a_Depth > TRACEDEPTH) return 0;
// trace primary ray
a_Dist = 1000000.0f;
vector3 pi;
Primitive* prim = 0;
int result;
// find the nearest intersection
for ( int s = 0; s < m_Scene->GetNrPrimitives(); s++ )
{
Primitive* pr = m_Scene->GetPrimitive( s );
int res;
if (res = pr->Intersect( a_Ray a_Dist ))
{
prim = pr;
result = res; // 0 = miss 1 = hit -1 = hit from inside primitive
}
}
// no hit terminate ray
if (!prim) return 0;
// handle intersection
if (prim->IsLight())
{
// we hit a light stop tracing
a_Acc = Color( 1 1 1 );
}
else
{
// determine color at point of intersection
pi = a_Ray.GetOrigin() + a_Ray.GetDirection() * a_Dist;
// trace lights
for ( int l = 0; l < m_Scene->GetNrPrimitives(); l++ )
{
Primitive* p = m_Scene->GetPrimitive( l );
if (p->IsLight())
{
Primitive* light = p;
// calculate diffuse shading
vector3 L = ((Sphere*)light)->GetCentre() - pi;
NORMALIZE( L );
vector3 N = prim->GetNormal( pi );
if (prim->GetMaterial()->GetDiffuse() > 0)
{
float dot = DOT( N L );
if (dot > 0)
{
float diff = dot * prim->GetMaterial()->GetDiffuse();
// add diffuse component to ray color
a_Acc += diff * prim->GetMaterial()->GetColor() * light->GetMaterial()->GetColor();
}
}
}
}
}
// return pointer to primitive hit by primary ray
return prim;
}
// -----------------------------------------------------------
// Engine::InitRender
// Initializes the renderer by resetting the line / tile
// counters and precalculating some values
// ----------------------------------------------------------
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3294 2004-09-16 08:47 common.h
文件 4911 2004-09-21 11:03 raytracer.cpp
文件 4185 2004-09-16 08:58 raytracer.dsp
文件 541 2004-07-08 16:04 raytracer.dsw
文件 1627 2004-09-16 10:58 raytracer.h
文件 3756 2004-09-21 11:04 scene.cpp
文件 3646 2004-09-16 11:10 scene.h
文件 4921 2004-08-30 21:38 surface.cpp
文件 1064 2004-08-30 21:39 surface.h
文件 3974 2004-09-16 08:47 testapp.cpp
- 上一篇:径向基函数插值的代码
- 下一篇:veriog语言实现UART
相关资源
- opengl的glut最全包
- glad.h库OpenGL开发用
- OpenGL+IMU显示姿态
- UE4赛车游戏.rar
- Cmake从入门到精通pdf教程
- 排课表程序拓扑排序
- OpenGL编程指南第七版(原书+目录+文本
- glut工具包,解决编译问题: 无法打
- OPENGL视频教程从入门基础到精通
- AMR-LBM-OpenMP-2D.rar
- 完整的六层电梯模拟程序
- OpenGL绘制图形包含20多个基本
- WM算法C
- 实现进程调度算法---动态优先级
- 用OPENGL做的空间探索程序.内有一个飞
- OPENGL做的太阳系五大行星的公转和自
- 基于openGL的三维地形场景的生成
- QT_A+_记事本
- Qt 控件 实现 QComboBox输入自动提示功能
- opengl 贴图教程
- opengl保存bmp图片函数
- 事件驱动 银行模拟系统
- OPENGL 字母模型
- QT opengl 绘制立体图形
- question 6-student score management system.rar
- 八路抢答器代码
- Qt加载3D模型
- openGL特效动画
- 链表实现学生管理
- 数据结构实验-链式存储和顺序存储实
评论
共有 条评论