使用高度在 GLSL 中的 3 个纹理之间进行插值

问题描述 投票:0回答:1

我正在研究一些简单的地形纹理,我对如何在地形的 3 个不同纹理之间进行插值感到非常困惑,其中您将根据地形的高度值进行插值。我也对这些纹理的法线感到困惑。每个纹理都有一个法线贴图,因此您有 3 个法线贴图读入着色器。您如何决定使用哪个法线进行照明?您是否也在 3 个法线之间进行插值?

这就是我目前正在做的事情。我正在两个纹理之间进行插值,但我不确定如何在三个纹理之间进行插值,并且还根据每个纹理法线进行照明工作。

vec3 grasNormalmap = texture(grassNormalMap, texcoords).rgb;
vec3 rocksNormalmap = texture(rocksNormalMap, texcoords).rgb;
vec3 snowNormalmap = texture(snowNormalMap, texcoords).rgb;

//surface normal being used currently but would like to use normal for each texture
// when doing lighting
vec3 N = normalize(normal); 

// Ambient lighting
vec3 ambient = vec3(0.2, 0.2, 0.2) * rockTextureColor;

// Diffuse lighting
vec3 diffuseAmount = vec3(0.5, 0.5, 0.5);
float diff_dot_product = max(dot(N, LightDirection), 0.0);
vec3 diffuse = diffuseAmount * diff_dot_product * rockTextureColor;

float grass_height = 1.f;
float rocky_height = 2.0f;
float mountain_snow_height = 3.0f;
// heightValue is from height map
float t = (heightValue - rocky_height) / (grass_height - rocky_height);
color = mix(rockTextureColor, grassTextureColor, t);
opengl glsl interpolation blending
1个回答
0
投票

首先,计算表面强度(表面法线和光线),您只需执行一次。请记住,表面是平坦的并且具有特定的方向(由表面法线描述)。表面法线和光线方向使我们能够计算光线照射表面的角度,因此我们最终会得到一个用于修改颜色的因子。

一旦获得整体强度,请考虑表面细节(法线贴图),您必须对每种颜色执行此操作(岩石与草不同,草与雪不同)。在第一步中,我们计算了表面的强度。由于每个单独的纹理都有自己特定的细节,因此我们将表面法线与细节法线(岩石中的裂缝、草叶的方向或雪晶的不同反射)结合起来。

您最终会得到三种不同的颜色,它们经过相同的过滤过程。

之后,您根据高度图生成单一颜色(爬得越高,岩石就越多,在山顶您最终会看到冰冷的景观)。

© www.soinside.com 2019 - 2024. All rights reserved.