【问题标题】:GLSL: calculating normals after tesselationGLSL:在曲面细分后计算法线
【发布时间】:2015-06-16 16:31:35
【问题描述】:

我在细分后计算法线时遇到问题。

目前我有代码可以对高度图进行采样并从中计算法线:

float HEIGHT = 2048.0f;
float WIDTH =2048.0f;
float SCALE =displace_ratio;

vec2 uv =  tex_coord_FS_in.xy;
vec2 du = vec2(1/WIDTH, 0);
vec2 dv= vec2(0, 1/HEIGHT);
float dhdu = SCALE/(2/WIDTH) * (texture(height_tex, uv+du).r - texture(height_tex, uv-du).r);
float dhdv = SCALE/(2/HEIGHT) * (texture(height_tex, uv+dv).r - texture(height_tex, uv-dv).r);

N = normalize(N+T*dhdu+B*dhdv);

但是低级镶嵌看起来不太好

我怎样才能摆脱这个?

【问题讨论】:

  • 你能把正常的计算移到片段阶段吗?我需要更多关于你实际在做什么的信息,以便提供更全面的答案。
  • 我想我可以,上面的代码正在计算镶嵌评估着色器中顶点的法线。

标签: opengl glsl normals tesselation


【解决方案1】:

摆脱这种情况的唯一方法是将法线贴图与计算的法线结合使用。您在右侧看到的法线是正确的。它们只是分辨率低,因为你对它们进行了细分。使用法线贴图和逐像素照明来突出复杂的细节。

另外,要考虑的一件事是初始网格的拓扑。更均匀分布的多边形会产生更均匀分布的镶嵌。

此外,您可能想这样做,而不是:

float dhdu = SCALE/(2/WIDTH) * (texture(height_tex, uv+du).r - texture(height_tex, uv-du).r);
float dhdv = SCALE/(2/HEIGHT) * (texture(height_tex, uv+dv).r - texture(height_tex, uv-dv).r);

从高度图中再采样几个点,并对它们进行平均,以在每个点处提取更平均的法线版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2017-01-25
    • 1970-01-01
    相关资源
    最近更新 更多