gpt4 book ai didi

c++ - 从高度图生成法线贴图?

转载 作者:IT老高 更新时间:2023-10-28 12:36:48 26 4
gpt4 key购买 nike

我正在为一款视频游戏使用随机分形以程序方式生成泥土。我已经使用中点置换算法生成了一个高度图并将其保存到纹理中。对于如何将其转化为法线纹理,我有一些想法,但我们将不胜感激。

我的高度纹理目前是 257 x 257 灰度图像(高度值为可见性目的而缩放):

enter image description here

我的想法是图像的每个像素代表 256 x 256 网格中的一个格坐标(因此,为什么有 257 x 257 高度)。这意味着坐标 (i, j) 处的法线由 (i, j)、(i, j + 1)、(i + 1, j) 和 (i + 1, j + 1) 处的高度确定)(分别称为 A、B、C 和 D)。

因此,鉴于 A、B、C 和 D 的 3D 坐标,是否有意义:

  1. 将四个分成两个三角形:ABC 和 BCD
  2. 通过叉积计算这两个面的法线
  3. 分成两个三角形:ACD 和 ABD
  4. 计算这两个面的法线
  5. 平均四个法线

...或者有没有我想念的更简单的方法?

最佳答案

我的水面渲染着色器中的示例 GLSL 代码:

#version 130
uniform sampler2D unit_wave
noperspective in vec2 tex_coord;
const vec2 size = vec2(2.0,0.0);
const ivec3 off = ivec3(-1,0,1);

vec4 wave = texture(unit_wave, tex_coord);
float s11 = wave.x;
float s01 = textureOffset(unit_wave, tex_coord, off.xy).x;
float s21 = textureOffset(unit_wave, tex_coord, off.zy).x;
float s10 = textureOffset(unit_wave, tex_coord, off.yx).x;
float s12 = textureOffset(unit_wave, tex_coord, off.yz).x;
vec3 va = normalize(vec3(size.xy,s21-s01));
vec3 vb = normalize(vec3(size.yx,s12-s10));
vec4 bump = vec4( cross(va,vb), s11 );

结果是一个凹凸 vector :xyz=normal, a=height

关于c++ - 从高度图生成法线贴图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5281261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com