投影紋理

教程

投影紋理

在這裏插入圖片描述

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;
}

<全文結束>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章