法线贴图生成 - 着色器和FBO

时间:2013-12-07 12:41:03

标签: opengl glsl fbo normals

我想从高度图生成法线贴图。我知道这是一个非常“过分夸大的问题”,但我没有找到任何关于此问题的好主题。法线贴图应比原始贴图大6-8倍。我已经在CPU上实现了它,但对于大纹理而言这是非常慢的,而不是我想用着色器做它。我的想法是将高度图渲染为全屏四边形,并使用着色器将其转换为片段着色器中的法线贴图,然后保存FBO纹理。这可以在init期间完成。的地图。但是我怎样才能用任何分辨率渲染它?

让我们假设高度图是* 20,000 * 20,000 *,那么法线贴图应该 160,000 * 160,000 。那超过25Mrd的纹素。当然,我只会将其中一部分流式传输到GPU。法线贴图的分辨率是否取决于我的GPU支持的视口或最大分辨率,或者我可以制作非常大的分辨率纹理?

有没有办法在GPU上使用着色器创建非常大的分辨率纹理?现在我正在使用双三次滤波计算地形着色器中每一帧的法线,这非常流畅,但是它是静态网格物体,没有必要,也会严重影响性能。

我的算法是获取插值高度,然后在指定高度附近再采样4。然后是一个简单的corss产品:

h(x,y) //is samples 16 heigths, then interpolates them using bicubic filtering
n(x,y)
{
    h1 = h(x+offset0,y+offset0);
    ...
    v1 = (x+offset0,h1,y+offset0)
    ...
    c1 = cross(v1-v0,v2-v0)
    ...
    n = normalize(c1+c2+c3+c4)
}

每个正常需要 5 * 16 = 80 个样本。我的法线贴图的 25,000,000,000 * 80 = 2,000,000,000,000 texelFetch。这对我来说似乎是一个非常大的数字,我只为4000 * 4000高度图制作了一个法线贴图(在CPU上),但这很慢。大约需要多少时间来计算它?在GPU上,我认为这需要约5分钟。在CPU上...我不会尝试。

我是否使用线性过滤高度图查找获得相同的结果,然后在法线贴图上运行双三次过滤器?

我不能在这一代使用第三方软件,我必须自己使用OpenGL实现它。如果依靠GPU来制作大分辨率地图,也许我可以渲染一次普通地图的一部分,然后再渲染其他地图。

0 个答案:

没有答案
相关问题