【问题标题】:Basic idea of shadow mapping using forward rendering (glsl 1.2)使用前向渲染的阴影映射的基本思想(glsl 1.2)
【发布时间】:2014-03-21 06:28:13
【问题描述】:

好吧,让我们看看我是否理解阴影映射背后的想法。

  1. 创建多个点亮的 FBO(最多 8 个)
  2. 为这些 FBO 创建相同数量的深度纹理(阴影贴图)
  3. 为每个 FBO 执行离屏渲染(渲染到纹理,从每个灯光的角度绘制场景,最多 8 次)

这对吗?

但是我如何渲染带有阴影的最终场景呢?我必须为每个阴影贴图渲染整个场景吗?

int main() {

    //Number of lights = 8;

    glUseProgram(programa);
      glUniformli(shadowM0,4);
      glActivateTexture(GL_TEXTURE4);
      glBindTexture(GL_TEXTURE_2D,depthT0);
      //Draw Escene?
    
      glUniformli(shadowM1,5);
      glActivateTexture(GL_TEXTURE5);
      glBindTexture(GL_TEXTURE_2D,depthT1);
      //Draw Escene?
    
      glUniformli(shadowM2,6);
      glActivateTexture(GL_TEXTURE6);
      glBindTexture(GL_TEXTURE_2D,depthT2);
      //Draw Escene?
      
      ...
    glUseProgram(0);
  
    ...  
}

如果没有,我应该如何进行场景的最终渲染?

如果我遗漏了某些内容或任何有关使用前向渲染改进想法的建议,我将不胜感激对上述步骤的任何更正。

【问题讨论】:

  • 全向光需要多个阴影贴图。
  • 好的,只有我使用点光源。但是那么这段代码是对的吗?对于相同数量的灯光 (8),我可以使用更少的 FBO 或更少的纹理对象吗?谢谢。
  • 点光源确实向各个方向发光,是吗?
  • 确实如此。抱歉,我指的是定向灯。

标签: opengl glsl


【解决方案1】:

方法不止一种。

最简单的解决方案是 - 只使用一个阴影贴图/FBO

foreach light {
  render shadowmap;
  foreach object {
    calculate lighting for given light with given shadowmap;
    additively blend with framebuffer;
  }
}

我的意思是glBlendFunc(GL_ONE, GL_ONE);

另一种方法是一次计算多个灯光,但它引入了其他问题,比如如果着色器期望计算8个灯光,但你只有7个?如果你有 16 个,则需要绘制两次(像往常一样使用添加剂混合)。

glUseProgram(programa);
  glUniformli(shadowM0,4);
  glActivateTexture(GL_TEXTURE4);
  glBindTexture(GL_TEXTURE_2D,depthT0);

  glUniformli(shadowM1,5);
  glActivateTexture(GL_TEXTURE5);
  glBindTexture(GL_TEXTURE_2D,depthT1);

  glUniformli(shadowM2,6);
  glActivateTexture(GL_TEXTURE6);
  glBindTexture(GL_TEXTURE_2D,depthT2);

  // ... <set all other shadowmaps>

  // now draw. once. and use all shadowmaps you've set in shader

【讨论】:

  • 嗯嗯嗯。这不是和我写的例子几乎一样吗? foreach shadowmap{draw escene}
  • 老实说,当您将不同的纹理绑定到不同的插槽并在其间绘制场景时,我真的不知道您尝试实现什么......这没有任何意义。如果它是一个纹理槽 - 好吧,也许,如果没有看到着色器代码就不可能说。
  • 你不说邮件标题吗?
  • 什么?.. 越来越难理解你了。我只是说你做错了。一次绑定所有纹理并在着色器中一次计算多个光源(如果您没有太多灯光,这将只需要一次绘制),或者使用一个纹理槽进行阴影贴图。你有问题的代码是可憎的,这两种方法都有点;即使它有效,也不应该。
  • 好的,所以我寻求帮助。修复多个shadowmaps的想法。
猜你喜欢
  • 1970-01-01
  • 2015-01-17
  • 2014-12-11
  • 2016-12-22
  • 2014-01-16
  • 2015-02-04
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多