投影紋理
1、投影紋理
將相機矩陣和模型矩陣相乘,最後得到紋理採樣座標:
頂點着色器:
uniform mat4 viewMatrixCamera;
uniform mat4 projectionMatrixCamera;
varying vec4 vTexCoords;
void main() {
...
// in: position,頂點局部座標
// in: modelMatrix,模型的世界座標矩陣
// out: vWorldPosition,模型世界座標
vWorldPosition = modelMatrix * vec4(position, 1.0);
// in: projectionMatrixCamera,相機的投影矩陣
// in: viewMatrixCamera,視圖模型矩陣
// in: position,頂點局部座標
// out: vTexCoords,模型在相機上的投影,在片元着色器中將作爲紋理採樣座標
vTexCoords = projectionMatrixCamera * viewMatrixCamera * vWorldPosition;
...
}
片元着色器:
varying vec4 vTexCoords;
void main() {
...
// 從世界空間轉換爲剪輯空間,將向量除以其.w分量來實現
vec2 uv = vTexCoords.xy / vTexCoords.w;
// 從剪裁空間[-1, 1]轉換爲uv查找範圍(即)[0, 1]
uv = uv * 0.5 + 0.5;
// 紋理採樣,投影座標作爲紋理採樣座標
vec4 outColor = texture2D(texture, uv);
...
}
2、如何確定背面
片元着色器:
void main() {
...
// ------這可以確保我們不在對象的背面也渲染紋理 start --------
// in: projPosition,相機的位置
// in: vWorldPosition,目標物體的位置
// out: projectorDirection,投影方向,視點指向目標物體
vec3 projectorDirection = normalize(projPosition - vWorldPosition.xyz);
// 通過查看法線和相機方向的點積來檢查人眼是否真的朝向相機
float dotProduct = dot(vNormal, projectorDirection);
if (dotProduct < 0.0) {
outColor = vec4(color, 1.0);
}
// ------這可以確保我們不在對象的背面也渲染紋理 end --------
gl_FragColor = outColor;
}
<全文結束>