0

キューブマップで影を計算しようとしています。それらを生成するために、レイヤード レンダリングを使用して、1 回のパスでキューブマップを生成します。いくつかのコードを添付したいのですが、それは私自身のエンジンを備えた完全な Haskell であり、それが良い考えかどうかはわかりません。ただし、これは GLSL コードです。

lightCubeDepthmapVS :: String
lightCubeDepthmapVS = unlines
  [
    "#version 330 core"

  , "layout (location = 0) in vec3 co;"
  , "layout (location = 1) in vec3 no;"

  , "uniform mat4 model;"

  , "void main() {"
  , "  gl_Position = model * vec4(co,1.);"
  , "}"
  ]

-- The geometry shader is used because we’re doing a layered rendering in order
-- to generate the whole cube depthmap in one pass. Each primitive (i.e.
-- triangle) gets duplicate 6 times; one time per cubemap face.
lightCubeDepthmapGS :: String
lightCubeDepthmapGS = unlines
  [
    "#version 330 core"

  , "layout (triangles) in;"
  , "layout (triangle_strip, max_vertices = 18) out;"

  , "out vec3 gco;"

  , "uniform mat4 ligProjViews[6];" -- 6 views

  , "void main() {"
  , "  for (int i = 0; i < 6; ++i) {"
  , "    for (int j = 0; j < 3; ++j) {"
  , "      gl_Layer = i;"
  , "      gco = gl_in[j].gl_Position.xyz;"
  , "      gl_Position = ligProjViews[i] * gl_in[j].gl_Position;"
  , "      EmitVertex();"
  , "    }"
  , "    EndPrimitive();"
  , "  }"
  , "}"
  ]

lightCubeDepthmapFS :: String
lightCubeDepthmapFS = unlines
  [
    "#version 330 core"

  , "in vec3 gco;"
  , "out vec4 frag;"

  , "uniform vec3 ligPos;"
  , "uniform float ligIRad;"

  , "void main() {"
  , "  frag = vec4(length(gco - ligPos) * ligIRad);"
  , "}"
  ]

ligIRad光半径の逆数です。したがって、結果のマップ (標準の深度マップではありません) は、[0;1] の 6 つの面の各ピクセルの距離ライト ポイントを格納します。ここで、0 = 0 および 1 = 光の半径です。このトリックにより、(1,1,1,1) でカラーマップをクリアし、従来の方向を使用してテクセルをフェッチし、フェッチした.r値をライトの半径で乗算するだけでライティング フェーズでキューブマップを使用して、ワールドスペース距離。

ただし、黒いキューブマップがあります。使っていないカラー(R)キューブマップとデプスキューブマップをFBOにつけます。レンダー バッファーをアタッチすると、FBO が完全でなくなることがわかりました (レンダー バッファーがレイヤード レンダリングに対応していないためですか?)。

最後の質問: キューブマップへのレイヤード レンダリングにバグがあると聞いたことがあります。それは関連していますか?そのようなバグへのリンクはありますか?

4

0 に答える 0