OpenGL 建立反射

2021-07-05 02:26:10 字數 2658 閱讀 6565

這一節我們實現下圖中的效果

要實現這個效果非常簡單,我們只需要在上一節 天空盒的**中增加點東西即可

在現實生活中,我們從上圖小球中看到的景象實際是光線通過小球的反射,進入我們的眼睛腫才能看到的

我們會通過自己的寫的反射著色器reflection.vp 來獲取這個反射的向量,這個向量就可以作為小球的紋理座標,小球的紋理任然使用天空盒的紋理圖

另外我們的程式支援按住鍵盤上的方向鍵在地圖上行走,假如我們的照相機向左旋轉了,在我們的小球中的景象應該向右旋轉

所以我們應該得到照相機旋轉矩陣的反向旋轉矩陣,我們用反向旋轉矩陣和反射向量相稱,把結果作為小球的紋理座標

可以使用方法 m3dinvertmatrix44(m3dmatrix44f minverse, const m3dmatrix44f m) 得到矩陣的反向矩陣

這一節的程式實在上一節天空盒的基礎上實現的

下面是反射頂點著色器reflection.vp中的**

// 需要opengl 最低版本為1.3

#version 130

// 需要從外界輸入的值

//頂點

in vec4 vvertex;

//法線

in vec3 vnormal;

//需要從外界設定的uniform值

uniform mat4 mvpmatrix;

uniform mat4 mvmatrix;

uniform mat3 normalmatrix;

uniform mat4 minversecamera;

//需要傳入到片段著色器中的紋理座標

smooth out vec3 vvaryingtexcoord;

void main(void)

下面是反射片段著色器reflection.fp中的**

// 需要opengl 最低版本為1.3

#version 130

out vec4 vfragcolor;

uniform samplercube cubemap;

//紋理座標

smooth in vec3 vvaryingtexcoord;

void main(void)

下面我們只列出和上一節天空盒**不一樣的地方

首先是全域性變數部分增加了如下**

glint               reflectionshader;

glint locmvpreflect, locmvreflect, locnormalreflect, locinvertedcamera;

然後是初始化函式setuprc

void setuprc()

//開啟mip貼圖模式

glgeneratemipmap(gl_texture_cube_map);

viewframe.moveforward(-4.0f);

//初始化小球模型資料

gltmakesphere(spherebatch, 1.0f, 52, 26);

//初始化立方體模型的資料,這個立方體就是用來貼6張天空的紋理的,從而形成天空盒

gltmakecube(cubebatch, 20.0f);

reflectionshader = gltloadshaderpairwithattributes("reflection.vp", "reflection.fp", 2,

glt_attribute_vertex, "vvertex",

glt_attribute_normal, "vnormal");

locmvpreflect = glgetuniformlocation(reflectionshader, "mvpmatrix");

locmvreflect = glgetuniformlocation(reflectionshader, "mvmatrix");

locnormalreflect = glgetuniformlocation(reflectionshader, "normalmatrix");

locinvertedcamera = glgetuniformlocation(reflectionshader, "minversecamera");

//載入自己寫的天空盒的著色器

skyboxshader = gltloadshaderpairwithattributes("skybox.vp", "skybox.fp", 2,

glt_attribute_vertex, "vvertex",

glt_attribute_normal, "vnormal");

locmvpskybox = glgetuniformlocation(skyboxshader, "mvpmatrix");

}

然後是渲染函式renderscene

void renderscene(void)

其他的**都和上一節天空盒的**一樣

Opengl中reflect反射演算法

在opengl或者其他的遊戲引擎shader 比如unity3d中 都有乙個方法叫做reflect用來計算光的反射向量,他的引數就是入射光向量和畫素法線向量。reflect r,n 那麼他的內部原理到底是什麼呢?我們先來看下下面這個 如圖所示,l就是入射向量,n就是法線,r就是反射向量,r是r平移到...

opengl 教程 18 漫反射光

環境光和漫反射光最大的區別在於 漫反射光依賴於光源的方向,而環境光和光源方向完全無關,環境光在場景中是均勻分布的,對場景中的所有物體都有效,而漫反射光在物體朝向光源的一面才有光照效果,在背面則沒有光照效果。如下圖所示,除了光源方向,漫反射光還和物體表面的法向有關。假設上圖中2個光束的強度都是一樣的,...

OpenGL學習筆記 天空盒(反射,折射)

先展示乙個效果圖 多個紋理組合起來對映到一張紋理上的一種紋理型別 立方體貼圖 cube map 簡單來說,立方體貼圖就是乙個包含了6個2d紋理的紋理,每個2d紋理都組成了立方體的乙個面 乙個有紋理的立方體。你可能會奇怪,這樣乙個立方體有什麼用途呢?為什麼要把6張紋理合併到一張紋理中,而不是直接使用6...