簡體   English   中英

OpenGL-使用立方體陰影貼圖渲染點光源?

[英]OpenGL - Rendering point light with cube shadow map?

我在渲染立方體陰影貼圖時遇到問題。 消極和積極的態度似乎是相反的,我不知道為什么。 試圖顛倒目標和方向,但我得到事件奇怪的輸出。

碼:

// init
glGenTextures(1, &mShadowCubeTex);
glBindTexture(GL_TEXTURE_CUBE_MAP, mShadowCubeTex);
for(int i = 0; i < 6; i++)
  glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT24, SHADOW_WIDTH, SHADOW_WIDTH, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
/* + filters + wrapping */
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);

glGenFramebuffers(1, &mShadowFbo);
glBindFramebuffer(GL_FRAMEBUFFER, mShadowFbo);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_COMPONENT, mShadowCubeTex, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

// render
static const struct {
  GLenum eTarget;
  vec3   vDirection;
  vec3   vUp;
} oPointLightConfigs[6] = {
  { GL_TEXTURE_CUBE_MAP_POSITIVE_X, vec3( 1.0f, 0.0, 0.0f), vec3(0.0f, 1.0f, 0.0f) },
  { GL_TEXTURE_CUBE_MAP_NEGATIVE_X, vec3(-1.0f, 0.0, 0.0f), vec3(0.0f, 1.0f, 0.0f) },
  { GL_TEXTURE_CUBE_MAP_POSITIVE_Y, vec3( 0.0f, 1.0, 0.0f), vec3(0.0f, 0.0f,-1.0f) },
  { GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, vec3( 0.0f,-1.0, 0.0f), vec3(0.0f, 0.0f, 1.0f) },
  { GL_TEXTURE_CUBE_MAP_POSITIVE_Z, vec3( 0.0f, 0.0, 1.0f), vec3(0.0f, 1.0f, 0.0f) },
  { GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, vec3( 0.0f, 0.0,-1.0f), vec3(0.0f, 1.0f, 0.0f) }
};

// shadow pass
for(int i = 0; i < 6; i++)
{
  glBindFramebuffer(target, mShadowFbo);
  glViewport(0, 0, SHADOW_WIDTH, SHADOW_WIDTH);
  glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, oPointLightConfigs[i].eTarget, mShadowCubeTex, 0);

  glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
  glDrawBuffer(GL_NONE);
  glReadBuffer(GL_NONE);
  glCullFace(GL_FRONT);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  for(CModel* pModel : mModels)
  {
    if(pModel->hasOption(NO_SHADOW_CAST))
    {
      mNullProgram->use(); // no color output

      mat4 M = pModel->getModelMatrix();
      mat4 V = lookAt(pPointLight->getPosition(), oPointLightConfigs[i].vDirection, oPointLightConfigs[i].vUp);
      mat4 P = mCamera->getProjectionMatrix();

      pNullProgram->set("MVP", P * V * M);

      pModel->draw();
    }
  }
}

// color pass
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDrawBuffer(GL_BACK);
glReadBuffer(GL_BACK);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

pLightProgram->use();

glActiveTexture(GL_TEXTURE6); 
glBindTexture(GL_TEXTURE_2D, mShadowCubeTex);

pLightProgram->set("V", mCamera->getViewMatrix());
pLightProgram->set("P", mCamera->getProjectionMatrix());

/* set program light uniforms */

for(CModel* pModel : mModels)
{
  pLightProgram->set("M", pModel->getModelMatrix());

  pModel->draw()
}


// lighting fragment shader
float computeShadowFactor(in samplerCube sShadowMap, in vec3 vL) {
  /* vL = vLightPosition - vVertexPosition */
  vec3 vLAbs = abs(vL);
  float fNear = 0.1;
  float fFar  = 1000.0;
  float fDepth = max(vLAbs.x, max(vLAbs.y, vLAbs.z));
  fDepth = ((fFar + fNear) / (fFar - fNear)) - ((2.0 * fFar * fNear) / (fFar - fNear)) / fDepth;
  fDepth = (fDepth + 1.0) * 0.5;

  float fShadow = texture(sShadowMap, -vL).r; /* -vL = vVertexPosition - vLightPosition */
  if(fDepth > fShadow) 
    return 0.0;
  return 1.0;
}

輸出:

在此處輸入圖片說明

在此處輸入圖片說明

更新:

我將+ oPointLightConfigs [i] .vDirection添加到...

V = lookat(pPointLight->mPosition, pPointLight->mPosition + oPointLightConfigs[i].vDirection, oPointLightConfigs[i].vUp);

輸出:

在此處輸入圖片說明

至少現在我得到一個陰影(而不是6個陰影)。 但是它以某種方式反轉了,並且Y軸沒有陰影。 當陰影從一個立方體貼圖面傳遞到另一個立方體貼圖面時,它會被中斷。 有什么提示嗎?

這些問題是由立方圖上的反向Y引起的。

我用了:

{ GL_TEXTURE_CUBE_MAP_POSITIVE_Y, math::vec3( 0.0f,-1.0, 0.0f), math::vec3(0.0f, 0.0f, 1.0f) },
{ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, math::vec3( 0.0f, 1.0, 0.0f), math::vec3(0.0f, 0.0f, 1.0f) },

用於設置陰影立方體貼圖和:

vL.y *= -1.0;

在對陰影立方體貼圖進行采樣之前,請在computeShadowFactor()中進行內部設置。

注意:我的+ Z軸進入顯示器-左手坐標系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM