建立乙個raymarching

2021-08-30 06:32:22 字數 2412 閱讀 4292

shadertoy 檢視

先解釋一波raymarching, raymatching是一種計算機圖形渲染方式,但它的潛力仍未被完全發掘。raymatching一般用於渲染體積紋理、高度圖以及解析曲面。如今,大多數遊戲用opengl或direct3d(directx)來使用顯示卡的硬體加速器繪製多邊形,電腦可以以每秒60幀的速度渲染幾百萬個三角面。雖然raymatching沒有那些圖形api那麼出名,但它可以僅用兩個三角面實現無與倫比的細節。

我們需要去定義camera的origin,target,和up 就是定義攝像機的起源,目標位置,還有就是定義向上的位置。

vec3 cameraorigin = vec3(2.0, 3.0, 2.0);

vec3 cameratarget = vec3(0.0, 0.0, 0.0);

vec3 updirection = vec3(0.0, 1.0, 0.0);

然後就可以得出攝像機的發向是

vec3 cameradir = normalize(cameratarget - cameraorigin);
由此可以計算出攝像機的右方向和頂上的方向。

vec3 cameraright = normalize(cross(updirection, cameraorigin));

vec3 cameraup = cross(cameradir, cameraright);

下面對螢幕座標進行轉化,把螢幕座標放縮到-1到1之間。

vec2 screenpos = -1.0 + 2.0 * gl_fragcoord.xy / iresolution.xy; // screenpos can range from -1 to 1

screenpos.x *= iresolution.x / iresolution.y; // correct aspect ratio

在知道了攝像機的方向之後,我們來計算出ray的方向。

vec3 raydir = normalize(cameraright * screenpos.x + cameraup * screenpos.y + cameradir);
在 marching 裡面 先來設定步進的光線總長度

const int max_iter = 100;
物體的離攝像機的最大範圍

const float max_dist = 20.0;
設定物體離光線的閾值距離

const float epsilon = 0.001;
下面是loop的**:在個裡面點會被轉化為和交集的東西。

// the raymarching loop

float totaldist = 0.0;

vec3 pos = cameraorigin;

float dist = epsilon;

// trying to find a point of intersection

for (int i = 0; i < max_iter; i++)

float sphere(vec3 pos, float radius)

float box(vec3 pos, vec3 size)

光也要在epsilon的距離裡面

if (dist < epsilon)

else

光函式裡面需要取得表面著色器的normal向量,可以用點來預計算出點的位置。

vec2 eps = vec2(0.0, epsilon);

vec3 normal = normalize(vec3(

distfunc(pos + eps.yxx) - distfunc(pos - eps.yxx),

distfunc(pos + eps.xyx) - distfunc(pos - eps.xyx),

distfunc(pos + eps.xxy) - distfunc(pos - eps.xxy)));

由光照公式可以得出

fragcolor = vec4(ambientcolor +

lambertian * diffusecolor +

specular * speccolor, 1.0);

shadertoy 看

建立乙個類

c 是一門物件導向的程式語言,而物件導向的基礎就是類 使用c 建立乙個student類 class student 學生類 輸出學生的資訊 void outputstudent void void student input char name,int age,int no void student...

建立乙個image

ceph 版本 0.94 7rbd命令操作的資源有volume 預設 snap lock三類資源 using rbd to create empty image rbd create size 1024000 test1 ceph src rbd.cc main code section 定義一些後...

建立乙個Activity

為了建立乙個新的 activity 你需要繼承 activity 類,定義 ui,實現功能。新的 activity 的最基本的框架 如下所示 import android.os.bundle public class myactivity extends activity 基本的 activity ...