问题标签 [level-of-detail]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - OpenGL ES 2.0 texture2D 偏差/lod
我正在使用 OpenGL ES 2.0 GLSL 功能来操作图像。我想要实现的是在从片段着色器中从纹理中获取样本时选择特定的细节级别(LOD)。显然texture2DLod()
,OpenGL ES 2.0 中的片段着色器不支持(但有一个扩展GL_EXT_shader_texture_lod
可以选择提供它。)
但是,默认texture2D()
函数提供了第三个可选参数偏差。据我了解,此参数应该是添加到当前 LOD 的偏移量。
在我的测试中,我正在绘制屏幕大小的四边形,并通过缩放样本坐标来放大纹理。我使用 GL_LINEAR_MIPMAP_LINEAR 作为缩小过滤器为纹理启用了 mipmapping。在 ARM Mali-400 GPU 上使用非零偏差参数进行采样时的结果如下图所示。
ISTM 认为一些像素使用缩小过滤器,而其他像素使用放大过滤器。
这是如何控制的?使用偏差时如何确定初始 LOD?可以从顶点着色器调整吗?
一个相关的问题是以下问题:
GLSL 采样器如何确定纹理的缩小以及 mipmap 级别?
更新:我注意到,如果我对纹理进行采样以使其覆盖屏幕,那么它似乎会进行正确的 mipmap 查找(即使它被放大了。)现在,如果我在样本坐标上添加一个小偏移量,那么我将开始看到上图中看到的条带(放大得更多。)如果我不使用偏差参数,我根本看不到任何条带。
directx - DX11 Tessellation LOD,直径不正确的细分值
我从以下withpaper NVidia TerrainTessellation WhitePaper实现了具有直径的 LoD 。在章节“船体着色器:镶嵌 LOD”第 7 页中,有一个很好的 LoD 与直径的解释。这里有一个很好的报价:
对于每个面片边缘,着色器计算边缘长度,然后在概念上拟合围绕它的球体。球体投影到屏幕空间中,其屏幕空间直径用于计算边缘的镶嵌因子。
这是我的 HullShader:
代码的一些图形解释:首先找到两个顶点之间的中心 从“圆” 项目上的相机sUp和sDown在Projection空间中 找到正交基(与相机方向成直角), 用于计算长度以计算镶嵌因子。
问题
镶嵌效果很好。但出于某些测试原因,我让对象旋转,因此我可以查看曲面细分是否也随着旋转而进行。有些我认为它不是100%正确的。看看平面,这个平面旋转了(1.0f,2.0f,0.0f),与深红色相比,浅红色显示出更高的镶嵌因子。绿色是 1.0 的因数。平面顶部应该比底部更详细。
我错过了什么?
一些测试用例
如果我删除旋转的东西,它看起来像这样:
如果我删除旋转并且包含这个简单版本的正交基计算:
它看起来像这样:
如果我不使用查找向量,这可能是个问题吗?你的 LoD 怎么样?我愿意尝试别的东西...
c++ - Best CLOD Method for Planet Rendering
I'm currently working on my thesis, it is an engine to render terrains of planetary size.
I'm still finishing my researh and I have encountered a lot of stuff about this subject, the problem is that I can't decide on wich LOD method I should use.
I know about geomipmapping, geometry clipmaps (GPU) and chunked LOD by Ulrich that work good on large terrains and can be used to render 6 faces of a cube and then "spherify" the cube by this method and I understand how to implement all of these methods on GPU using C++/OpenGL/GLSL (using methods like ROAM or any other method that doesn't use a cube is out of my reach because of texturing is a pain).
So, I don't have the time to implement ALL the methods and see wich one is the best and more suitable for a planetary scale and I'm asking here to see if someone has made this kind of comparison and help me decide wich method should I implement and use (my tutor is kind of crazy and wants me to do something with an icosahedron, but I can't understad that method unless using ROAM)
Anyways, if you can help me decide or have any other suggestion or method I really will appreciate. One condition is that the method should be able to implement GPU side (at least most of it) to prevent CPU bottleneck.
Another request is that I know there are numerical problems about precision with floats when getting a lot of detail in the terrain, I don't know how to solve it, I read a solution in a forum but can't get to understand how to implement, I lost track of that thread and I would like to know how to solve this precision problem.
PD: Sorry for my english.
[EDIT] I'm currently reading about some matrix transformations to solve the float precision, z-fighting issues, frustrum culling with dynamic z-values, and data representation for chunks (using patch space with floats and its position in the world coordinates as double) so I think I can solve the precision problem easily. I still need a comparison between LOD methods with your opinions and suggestions to decide which is better for this project. Take in count difficulty of implementation vs visual quality vs performance, I want the best.
Something I forgot to mention is that the generation is hybrid, I mean, I should be able to render the planet entirely using GPU (heights calculated on the fly) and/or using a base heightmap image and add details with GPU (vertex shader). Texturing will be a side part I will trouble latter, right now I'm happy using just colors depending on the height, or maybe using some kind of noise texture generated on the fragment shader.
networking - 如何将规则的高度网格转换为三角形不规则网络?
我正在寻找一种将规则的高度网格(例如1024x1024)转换为三角形不规则网络的算法。这是一个显示三角形不规则网络示例的图像:
我在互联网上寻找一种算法来转换它,但我就是找不到。基本上,三角形密度取决于粗糙度和/或像素误差(光栅化时)或类似的东西。
graphics - 3D 图形中的详细程度 - 优缺点是什么?
我了解 LOD 的概念,但我试图找出它的负面影响,但我在谷歌搜索中没有看到任何提及。我不断遇到的唯一优点是,它通过在对象远时省略细节并在对象近时显示更好的图形来提高性能。
说真的,这是唯一的赞成和零反对?请指教。坦克。
performance - OpenLayers 支持 KML 中的详细级别
OpenLayers 是否支持根据Level of Details标签 ( <Lod/>
) 切换区域的可见性?据我研究和尝试,参考文献中提到的示例 KML 均不适用于 OpenLayers/Google 地图。您可能还对gmaps 中有关 LoD 的类似问题感兴趣,这表明没有人关心细节支持的级别,因此有以下问题:
- 有没有人找到任何活生生的证据证明细节水平实际上一直在起作用?
- 如果没有,是否有人知道如何使用 KML 区域,如果它们仍会一次全部加载到浏览器中?
- 如果仍然没有 - 您是否知道任何方法来解决使用 KML 以智能且有效的方式加载大量功能 (>100000) 的问题?或者,对于某些自定义实现,例如放大/缩小事件处理和手动切换功能的可见性,应该放弃“官方支持”的解决方案?
three.js - 使用three.js在片段着色器中手动选择mipmaps
我正在使用 three.js 中的 glsl es 编写一个基于物理的着色器。为了添加镜面全局照明,我使用内部带有 mipmap 链的立方体贴图 dds 纹理(使用 CubeMapGen 进行预计算,如这里所述)。我需要在片段着色器中访问这个纹理,我想手动选择 mipmap 的索引。这样做的正确功能是
但它仅在顶点着色器中可用。在我的片段着色器中,我使用了类似的功能
但它效果不佳,因为偏差参数只是添加到自动计算的细节级别。因此,当我放大或缩小场景时,mipmap 的 LOD 会发生变化,但对于我的着色器,它必须相同(它必须仅取决于粗略参数,如上面的链接中所述)。
我想手动选择片段着色器中mipmap的级别仅取决于材质的粗糙度(例如使用公式mipMapIndex = roughness*numMipMap
),因此它必须与距离一致,并且在缩放时不会自动更改。我该如何解决这个问题?
opengl - 地形 LOD 相机移动裂缝
我有一个基于网格的地形和一个四叉树。在一个模拟步骤中,我执行以下操作:
- 处理输入。
- 更新矩阵。
- 构建四叉树(查看视锥体剔除,距离检查)。
- 闭合裂缝。
- 将启用的点复制到顶点数组。
- 绘制顶点数组。
自然地,在不检查未连接点的情况下,我会在具有不同 lod 的相邻四边形之间出现裂缝。
我可以在相机静止时关闭所有间隙。
但问题是,当我的相机在移动时,一些四边形之间有明显的裂缝,这些裂缝在最后一帧之后发生了变化。
opengl-es - 为什么无法访问片段着色器中的纹理 lod
我试图在 OpenGL ES 2.0 片段着色器中处理 mipmaped 纹理的细节级别。
根据这个答案,不可能使用bias
参数来texture2D
访问片段着色器中特定级别的细节。根据这篇文章,详细程度是根据相邻片段的并行执行自动计算的。我必须相信事情就是这样运作的。
我无法理解的是它的原因。为什么不能访问特定级别的详细信息,而这样做确实应该非常简单?为什么必须依赖复杂的固定功能呢?
对我来说,这似乎非常违反直觉。毕竟,整个 OpenGL 相关的东西都是从固定的功能演变而来的。并且 OpenGL ES 旨在覆盖比 OpenGL 更广泛的硬件范围,因此仅支持许多事物的更简单版本。因此,如果规范的开发人员决定 LOD 参数是强制性的(可能默认为零),并且着色器程序员以他认为合适的任何方式来制定适当的 LOD,我将完全理解。添加一个自动执行该计算的函数似乎是我在桌面 OpenGL 中所期望的。
不提供对特定级别的直接访问对我来说根本没有任何意义,无论我如何看待它。特别是因为该bias
参数表明我们确实被允许调整细节级别,所以显然这不是关于从内存中仅针对并行处理的一堆片段的单个级别获取数据。我想不出任何其他原因。
当然,为什么问题往往会吸引意见。但由于 Stack Overflow 不接受基于意见的答案,因此请将您的意见仅作为评论发表。另一方面,答案应该基于可验证的事实,例如有明确知识的人的陈述。如果有开发者讨论这个事实的记录,那就完美了。如果里面有人发博文讨论这个问题,那还是很好的。
由于堆栈溢出问题应该处理真正的编程问题,有人可能会争辩说,询问原因是一个糟糕的问题。获得答案不会使明确的 lod 访问突然出现,因此不会帮助我解决眼前的问题。但我觉得这里的原因可能是由于 OpenGL ES 如何工作的一些重要方面,我到目前为止还没有掌握。如果是这样,那么理解这一决定背后的动机将有助于我和其他人更好地理解 OpenGL ES 作为一个整体,从而在他们的程序中更好地利用它,在性能、准确性、可移植性等方面. 因此,我可能会将这个问题表述为“我错过了什么?”,这对我来说是一个非常现实的编程问题。
javascript - Three.js 中的 LOD(合并网格)
我正在寻找一种方法,我可以在其中以高效的方式使用 three.js 的 LOD 对象(http://threejs.org/examples/webgl_lod.html)。
我的想法是实现一个 LOD 方法,就像第 2.1 章中的这个方法(http://dl.acm.org/citation.cfm?id=364375)。
有3个级别:
- 查看器附近的 3D 模型
- 中等范围的 2.5D 体积纹理
- 以及远处的 2D 纹理
现在我的问题是:
是否可以在 three.js 的 LOD 对象中将 2D 纹理显示为关卡?
我可以合并远处的lod对象吗?(示例:靠近相机的有 10 个网格,中间有 2 个组网格,远处有 1 个 2d 纹理)
谢谢你的帮助!