《一周學完光線追蹤》學習 六 抗鋸齒

2021-10-06 15:06:47 字數 2627 閱讀 4709

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術

當乙個真正的相機拍攝一張**,通常沒有沿邊緣的鋸齒,因為邊緣畫素是一些前景和一些背景的混合。我們可以通過平均每個畫素內的一組樣本獲得相同的效果。我們不必為分層而煩惱,這是有爭議的,但對我的節目來說卻是司空見慣的。對於某些光線***來說,這是非常關鍵的,但是我們正在編寫的那種一般的光線***並不能從中得到太多好處,而且會使**更難看。我們把相機類抽象了一點,以便以後可以製作乙個更酷的相機。

我們需要的是乙個隨機數生成器,它返回真實的隨機數。傳統上,c++沒有標準的隨機數生成器,但是大多數系統都有drand48(),它是我在這裡使用的。但是,c++的更新版本已經解決了這個問題。無論您的基礎結構是什麼,都要找到乙個函式,它返回乙個規範隨機數,按照慣例,該隨機數返回0<=ran<1範圍內的隨機實數。1之前的「小於」很重要,因為我們有時會利用它。(這裡我們採用的是 rand() / (rand_max + 1.0) 函式來生成0-1之間的隨機數)

對於給定的畫素,我們在該畫素內有多個取樣,並通過每個取樣傳送光線。然後對這些光線的顏色進行平均:

把所有這些放在一起,就產生了乙個camera類,它封裝了我們以前的簡單軸對齊相機:

#pragma once

#ifndef __camera_h__

#define __camera_h__

#include "ray.h"

class camera

ray get_ray(float u, float v)

vec3 lower_left_corner;

vec3 horizontal;

vec3 vertical;

vec3 origin;

};#endif

main函式也要修改一下:

#include #ifdef _win64

#define glut_no_lib_pragma

#pragma comment (lib, "opengl32.lib") // link with microsoft opengl lib

#pragma comment (lib, "glut64.lib") // link with win64 glut lib

#endif //_win64

#ifdef _win32

//on windows, include the local copy of glut.h and glext.h

#include "glut.h"

#include "glext.h"

#define get_proc_address( str ) wglgetprocaddress( str )

#endif

#include "vec3.h"

#include "ray.h"

#define width 400

#define height 200

unsigned char *pixels;

#include "hitable.h"

#include "sphere.h"

#include "hitablelist.h"

#define maxfloat 20.0

#include "camera.h"

#include "time.h"

vec3 color(const ray&r,hitable *world)

}void draw(void)

int main()

col /= float(ns);

int offset = (width*j + i) * 4;

pixels[offset + 0] = (unsigned char)255.99*col[0];

pixels[offset + 1] = (unsigned char)255.99*col[1];

pixels[offset + 2] = (unsigned char)255.99*col[2];

pixels[offset + 3] = 255;

} }int argc = 0;char *ar** = ;

glutinit(&argc, &ar**);

glutinitdisplaymode(glut_single | glut_rgba);

glutinitwindowsize(width, height);

glutcreatewindow("bitmap");

glutdisplayfunc(draw);

glutmainloop();

}

放大生成的影象時,最大的變化是部分背景和部分前景的邊緣畫素:

整體效果如圖:

《一周學完光線追蹤》學習 三 光線相機和背景

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 所有光線 都有乙個光線類,以及計算沿光線看到的顏色。讓我們把射線看作乙個函式,p t a t b,這裡p是3d中沿直線的3d位置,a是射線的原點,b是射線的方向。射線引數t是實數 中的浮點數 插入不同的t和p t 沿射線移動點。加上負t,你就可以得...

《一周學完光線追蹤》學習 九 電介質材料

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 透明材料如水 玻璃和鑽石都是電介質。當光線擊中它們時,它 成反射光線和折射 透射 光線。我們將通過在反射或折射之間隨機選擇並在每次互動中僅生成乙個散射光線來處理該問題。最難除錯的部分是折射光線。如果有折射光線的話,我通常先讓所有的光線折射。為了這個...

《一周學完光線追蹤》學習 十一 離焦模糊

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 現在我們的最後乙個特點 離焦模糊。注意,所有的攝影師都會稱之為 景深 所以請注意,只有在朋友之間使用 離焦模糊 在真正的相機中,我們使焦距模糊的原因是因為它們需要乙個大洞 而不僅僅是乙個針孔 來收集光線。這會使所有的東西都散焦,但是如果我們把乙個鏡...