OpenGL(二十) 投影 的shader實現
阿新 • • 發佈:2019-01-09
簡單說來 投影 是將一個紋理貼到另一個模型或圖片上的技術。在現實生活中,皮影戲就是根據這個原理產生的。
原理
參照皮影戲,我們需要一個投射器,一個取樣圖和一個成像模型。這樣一想,跟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值來衡量是否需要投影取樣圖。具體可以結合之前的文章,比較簡單就不實現了。
總結
本文介紹瞭如何製造投影。另外,在非平行光的情況下,可以製作出有形變的投影哦。