這一節我們實現下圖中的效果
要實現這個效果非常簡單,我們只需要在上一節 天空盒的**中增加點東西即可
在現實生活中,我們從上圖小球中看到的景象實際是光線通過小球的反射,進入我們的眼睛腫才能看到的
我們會通過自己的寫的反射著色器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...