1. 程式人生 > >OpenGL(二十) 投影 的shader實現

OpenGL(二十) 投影 的shader實現

簡單說來 投影 是將一個紋理貼到另一個模型或圖片上的技術。在現實生活中,皮影戲就是根據這個原理產生的。

原理

參照皮影戲,我們需要一個投射器,一個取樣圖和一個成像模型。這樣一想,跟OpenGL(十九)陰影 通過ShadowMap的shader實現中提到的投影模型是差不多的。不同之處在於,不需要採集深度圖,當進行到第二步時,也不需要比較深度。而是直接取出取樣圖中texcoord對應的顏色進行混合。

實現

依照之前所述,在shader中我們需要畫素上的點轉換到投影視口中,然後依照texcoord從取樣圖中取色。

//vs
attribute vec3 pos;
attribute vec2 texcoord;
attribute vec3 normal;
uniform mat4 M;
uniform mat4 P;
uniform mat4 V;
uniform mat4 U_ProjectorMatrix;
varying vec2 V_Texcoord;
varying vec3 V_WorldPos;
varying vec4 V_ProjectCoord;
void
main()
{ V_Texcoord=texcoord; vec4 worldPos=M*vec4(pos,1.0); V_WorldPos=worldPos.xyz; V_ProjectCoord=U_ProjectorMatrix*worldPos; gl_Position=P*V*worldPos; } //fs uniform sampler2D U_ProjectiveTexture;//projective texture uniform sampler2D U_MainTexture; varying vec2 V_Texcoord; varying vec3 V_WorldPos; varying vec4 V_ProjectCoord; void
main()
{ if(V_ProjectCoord.z>0.0) { gl_FragColor=texture2D(U_MainTexture,V_Texcoord)*textureProj(U_ProjectiveTexture,V_ProjectCoord); } else { gl_FragColor=texture2D(U_MainTexture,V_Texcoord); } }

有遮擋的投影

當成像物體不止一個時,投影通常要能體現出被投影物體的遮擋關係。這時就要用到深度圖的比較了,根據z值來衡量是否需要投影取樣圖。具體可以結合之前的文章,比較簡單就不實現了。

總結

本文介紹瞭如何製造投影。另外,在非平行光的情況下,可以製作出有形變的投影哦。