Disney的brdf專案框架分析

2021-10-02 18:47:29 字數 3435 閱讀 3352

接著這篇文章:

我們繼續。

1.如何載入brdf檔案,brdf檔案是裡面是什麼函式?

brdfbase.cpp中:

bool brdfbase:

:loadbrdf

(const

char

* filename )

brdf檔案所在位置:

3.brdf內容分析舉例

以d_ggx.brdf為例子:

analytic

# ggx from walter 07

# variables go here...

# only floats supported right now.

# [type]

[name]

[min val]

[max val]

[default val]

::begin parameters

float alpha 0.0011.1

//最小值,最大值,預設值

::end parameters

# then comes the shader. this should be glsl code

# that defines a function called brdf (although you can

# add whatever else you want too, like sqr() below).

::begin shader

const

float pi =

3.14159265358979323846

;float

sqr(

float x)

float

ggx(

float alpha,

float costhetam)

vec3 brdf

( vec3 l, vec3 v, vec3 n, vec3 x, vec3 y )

::end shader

brdf函式呼叫ggx函式。

讀取的細細分析:

brdfbase* b =

null

;//基類指標

bool success = false;

//bool變數

// .brdf is an analytic brdf file

else

if( extension ==

"brdf"

)

讀取第一行:

std:

:ifstream ifs

( filename )

;std:

:string line, trimmedline;

// first line needs to be the brdf typeif(

!getline

( ifs, line )

)return false;

判斷讀取的型別:

// make sure we know how to read this

std:

:string type =

trim

(line)

;type = type.

substr(0

, type.

find

(' '))

;if( type !=

"analytic"

&& type !=

"bparam"

)return false;

接下來是逐行讀取:

while

(getline

( ifs, line )

)

float型別的結構體:

struct brdffloatparam

;

例項化乙個float結構體,然後新增到列表中去:

void brdfbase:

:addfloatparameter

( std:

:string name,

float min,

float max,

float value )

引數讀取完畢之後,就是一行一行讀取shader,進行拼接:

bool brdfanalytic:

:processlinefromsection

( std:

:string section, std:

:string line )

以畫乙個球體為例子:

litspherewidget類中的drawsphere方法:

準備shader:

void litspherewidget:

:drawsphere

(double r,

int lats,

int longs )

這裡的brdfs是乙個集合,從集合中拿出第0個位置的brdf函式。

然後將讀取出來的brdf函式插入到指定的shader中去:getbrdffunction就是獲取brdf函式。

bool brdfbase:

:compileshader

( dglshader*

& shader, std:

:string vs, std:

:string fs, std:

:string gs )

然後就是將shader塞到sphere中進行繪製,繪製的部分**如下:

void sphere:

:draw

(const dglshader *shader)

glf->

glbindvertexarray

(_vao)

;int vertex_loc = shader->

getattriblocation

("vtx_position");

if(vertex_loc>=0)

int color_loc = shader->

getattriblocation

("vtx_color");

if(color_loc>=0)

ok,就有了:

BRDF模糊環境光照的簡單實現

基於物理的渲染系統用雙向反射分布函式 brdf 來描述物體表面的反射表現。brdf考慮物體表面各個方向的入射光 環境光 而不是僅僅計算某單一方向的入射光。近年的大量相關研究投入到如何實現環境光照效果與硬體渲染相結合。然而,其大部分的實現過於複雜,而且對硬體的要求過高。另一方面,眾所周知,在brdf實...

雙向反射率BRDF的定義

自己看書一直沒有這麼明白這個定義,這個部落格解釋的確是很不錯,收藏了。物體表面對電磁波的反射有三種形式 鏡面反射 mirror reflection 反射能量集中在乙個方向,反射角 入射角 漫反射 diffuse reflection 整個表面都均勻地向各向反射入射光稱為漫反射 方向反射 direc...

基於框架的 專案目錄框架 搭建

比如基於tp這種框架的專案,需要如何搭建 架子呢。建議首先乙個基本的 基類common。如果有其他 需求 可以參考api 設定介面類 用於規範實現。然後對 各個不同使用者端 或者 型別 設定base 類。如下 basehomeaction.class.php basememberaction.cla...