在 Threejs 中实现 32 位高度图顶点着色器

2023-12-19

我正在尝试重新调整找到的高度图着色器示例的用途here http://stemkoski.github.io/Three.js/Shader-Heightmap-Textures.html转换为 32 位精度而不是 8 位的精度。正在进行的代码位于 github 上:https://github.com/bgourlie/ Three_heightmap https://github.com/bgourlie/three_heightmap

高度图是在 .NET 中生成的。高度在 0f...200f 范围内,并转换为 32 位颜色值(Unity 的颜色结构 http://docs.unity3d.com/ScriptReference/Color.html)使用以下方法:

private static Color DepthToColor(float height)
{
    var depthBytes = BitConverter.GetBytes(height);
    int enc = BitConverter.ToInt32(depthBytes, 0);
    return new Color((enc >> 24 & 255)/255f, (enc >> 16 & 255)/255f, (enc >> 8 & 255)/255f,
            (enc & 255)/255f);
}

颜色数据被编码为 png,结果如下所示:

顶点着色器正在获取此图像数据并将 RGB 值转换回原始高度值(使用我的问题中回答的技术here https://stackoverflow.com/questions/28652695/webgl-heightmap-using-vertex-shader-using-32-bits-instead-of-8-bits):

uniform sampler2D bumpTexture; // defined in heightmap.js
varying float vAmount;
varying vec2 vUV;

void main()
{
  vUV = uv;
  vec4 bumpData = texture2D( bumpTexture, uv );
  vAmount = dot(bumpData, vec4(1.0, 255.0, 65025.0, 16581375.0));
  // Uncomment to see a "flatter" version
  //vAmount = dot(bumpData, vec4(1.0, 1.0/255.0, 1.0/65025.0, 1.0/160581375.0));

  // move the position along the normal
  vec3 newPosition = position + normal * vAmount;
  gl_Position = projectionMatrix * modelViewMatrix * vec4( newPosition, 1.0 );
}

结果肯定是一团糟:

我可以通过改变这一行让它变得更平坦:

vAmount = dot(bumpData, vec4(1.0, 1.0/255.0, 1.0/65025.0, 1.0/16581375.0));

这会给我一个更平坦的图像,它至少显示了生成地形的漂亮轮廓,但几乎完全平坦的平面(有轻微但不明显的变化):

我认为我做错了一些事情,我只是不知道是什么。我不确定我是否正确编码了原始浮点数。我不确定我是否在顶点着色器中正确解码它(我得到的值肯定超出了 0...200 的范围)。一般来说,我在 3D 图形方面也不是很有经验。因此,任何有关我做错了什么或一般如何实现这一目标的指示都将不胜感激。

同样,可以在此处找到自包含的正在进行的代码:https://github.com/bgourlie/ Three_heightmap https://github.com/bgourlie/three_heightmap


你的颜色:

return new Color((enc >> 24 & 255)/255f, (enc >> 16 & 255)/255f, (enc >> 8 & 255)/255f,
        (enc & 255)/255f);

...包含最高有效字节enc in r,第二重要的是g, etc.

This:

vAmount = dot(bumpData, vec4(1.0, 255.0, 65025.0, 160581375.0));

builds vAmount with r在最低有效字节中,g次低位等(尽管被乘数应为 256、65536 等*)。所以字节的顺序不正确。更扁平的版本:

vAmount = dot(bumpData, vec4(1.0, 1.0/255.0, 1.0/65025.0, 1.0/160581375.0));

以正确的顺序获取字节,但将输出值缩放到范围内[0.0, 1.0],这可能就是它看起来基本平坦的原因。

因此,请切换编码或解码字节的顺序并选择合适的比例。

(*)这样想:可以在任何通道上传输的最小数字是1.0 / 255.0。最不重要的通道将在该范围内[0, 1.0] — from 0 / 255.0 to 255.0 / 255.0。您想要缩放下一个通道,使其最小值成为该比例上的下一个值。所以它的最小值应该是256 / 255.0。所以你需要转1.0 / 255.0 into 256.0 / 255.0。您可以通过乘以来实现256,不是由255.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Threejs 中实现 32 位高度图顶点着色器 的相关文章

  • YUV420p 上的大量绿色 --> iOS 上 OpenGL 2.0 着色器中的 RGB

    我想使用 ffmpeg 和 OpenGL ES 2 0 为 iOS 制作一个电影播放器 但我有一些问题 输出 RGB 图像有很多绿色 这是代码和图像 480x320 宽度和高度 512x512 纹理宽度和高度 我从 ffmpeg AVFra
  • 如何使用 OpenGL ES 2.0 旋转对象?

    在 OpenGL ES 1 1 中 您可以使用glRotatef 旋转模型 但 OpenGL ES 2 0 中不存在该函数 那么 在OpenGL ES 2 0中如何进行旋转呢 为了遵循克里斯蒂安所说的 您需要自己跟踪模型视图矩阵并操纵它来执
  • Android GLSurfaceView 具有可绘制背景

    我有一个带有可绘制对象作为背景的 GLSurfaceView 但是在没有 surfaceView setZOrderOnTop true 的情况下渲染时只有背景可见 我需要避免使用 setZOrderOnTop true 因为在 GLSur
  • Cocos2d:CCSpriteBatch 节点是否仅绘制可见属性设置为 true 的精灵?

    CCSpriteBatch 节点是否仅绘制可见属性设置为 true 的精灵 或者它也考虑屏幕尺寸 换句话说 如果节点内的精灵位于屏幕之外 opengl 绘制调用的性能是否会反映这一点 不 不 CCSpriteBatchNode 始终绘制所有
  • 渲染脚本渲染在Android上比OpenGL渲染慢很多

    背景 我想根据Android相机应用程序的代码添加实时滤镜 但Android相机应用程序的架构是基于OpenGL ES 1 x 我需要使用着色器来自定义我们的过滤器实现 然而 将相机应用程序更新到OpenGL ES 2 0太困难了 然后我必
  • lwjgl 3 , glUniformMatrix4 导致 jre 崩溃

    我正在使用 lwjgl 3 并学习现代 opengl 3 我想将统一矩阵发送到顶点着色器 以便我可以应用转换 我尝试过 但程序因此错误而崩溃 A fatal error has been detected by the Java Runti
  • 开发iPhone游戏需要什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • iPhone OpenGL ES 单视图还是多视图?

    我很困惑为 iPhone 编写游戏时最好的方法是什么 游戏将使用 OpenGL 渲染 但我很好奇创建开始屏幕 菜单 高分页面等 您是否使用 OpenGL 完成所有这些操作 或者创建额外的 UIView 并使用 UIKit 我认为没有最好的方
  • 将自己的结构传递到 opengl es 2.0 着色器中

    我想尝试 OpenGL ES 2 0 编程指南 一书中的照明示例 在着色器中他们制作了两种结构 struct directional light vec3 direction normalized light direction in ey
  • 旋转后平移

    我正在使用适用于 Android 的 OpenGL ES 2 0 我正在使用触摸屏平移和旋转模型 我的平移仅在 x y 平面内 并且我的旋转仅围绕 z 轴 想象一下 直接向下看桌子上的地图 移动到地图上的各个坐标 并且能够旋转地图在你正在看
  • 如何使用键盘和鼠标控制相机 - Three.js

    我在 WEB GL 中有一个带有 Three js 的 3D 环境 并且我曾经使用 Orbitcontrols js http codepen io nireno pen cAoGI http codepen io nireno pen c
  • OpenGL - 我应该存储属性/统一位置吗?

    Are glGetUniformLocation and glGetAttribLocation耗时 哪种方式更好 Call glGetAttribLocation or glGetUniformLocation每次我需要它 将位置存储在变
  • WebGL 如何设置深度缓冲区中的值?

    在 OpenGL 中 深度缓冲区值是根据场景的近剪裁平面和远剪裁平面计算的 参考 从深度缓冲区获取真实的 z 值 https stackoverflow com questions 6652253 getting the true z va
  • 在没有 SurfaceView 的 Android 上获取 GPU 信息

    在Android上 有没有一种方法可以在不创建SurfaceView的情况下获取GPU信息 我不想使用 OpenGL 绘制任何内容 但我只需要获取硬件信息 例如供应商 OpenGL ES 版本 可用扩展等 抱歉 我不知道如何在 Androi
  • 在 Chrome 18 中检测 SwiftShader WebGL 渲染器

    我有一个 2D HTML5 游戏引擎 www scirra com http www scirra com 并且确实想检测 WebGL 是否将使用 Chrome 18 的 Swiftshader 软件渲染器进行渲染 如果是这样我们会much
  • Google 的 Android OpenGL 教程是否教授了错误的线性代数?

    在帮助另一位用户解决有关该问题的问题后响应触摸事件 http developer android com training graphics opengl touch htmlAndroid教程 我下载了源代码 并且对我所看到的感到非常困惑
  • cocos2d-iphone-2.1-beta2 中的 CCScrollLayer 问题

    您好 我遇到了最新 cocos2d beta 中 CCScrollLayer 中所述的问题 主要是在编译时我得到 use of undeclared identifier CC GL BLEND 有没有办法解决这个有人发现的问题 您可以安全
  • 为什么单个 Vec4 乘法会大大减慢我的 ogl es 2 片段着色器的速度?

    我正在为 iOS 设备编写 2D OpenGL 游戏 现在 我正在研究 iPad 第一代 上的性能 该游戏有 ogl 1 1 和 2 0 的代码路径 我可以通过 define 使用 ogl 2 0 时 分析器告诉我 我的渲染器利用率 相当稳
  • 使用矩阵变换 Three.js 场景图

    我正在尝试将文件中的场景加载到 Three js 中 自定义格式 不是 Three js 支持的格式 这种特殊格式描述了一个场景图 其中树中的每个节点都有一个指定为 4x4 矩阵的变换 将其推送到 Three js 的过程如下所示 Yeah

随机推荐