问题标签 [tessellation]

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.

0 投票
1 回答
1219 浏览

c - 更好地控制 OpenGL 中的曲面细分?

我花了一天时间开发一个 OpenGL 应用程序,该应用程序将镶嵌网格并应用镜头失真。目标是能够为各种不同的镜头渲染广角镜头。到目前为止,我已经让着色器正确地应用了失真,但我一直在以我想要的方式控制镶嵌时遇到问题。现在我的 Tessellation Control Shader 只是将一个三角形分解为一组较小的三角形,然后我在 Tessellation Evaluation Shader 中应用镜头失真。

我使用这种方法遇到的问题是,当我在场景中有非常大的三角形时,它们往往需要更多的变形。这意味着需要对它们进行更多细分,以确保获得好看的结果。不幸的是,我无法在顶点着色器或镶嵌控制着色器中计算三角形的大小(在屏幕空间中),但我需要在镶嵌控制着色器中定义镶嵌量。

那么我的问题是,有没有办法在 OpenGL 的可编程管道中获取整个基元,计算一些关于它的指标,然后使用这些信息来控制曲面细分?

为了清楚起见,这里有一些问题的示例图像......

小三角形看起来不错

图 1(上图):每个红色或绿色正方形最初是 2 个三角形,这个例子看起来不错,因为三角形很小。

大三角形看起来很糟糕

图 2(上图):每个红色或绿色区域最初是 2 个三角形,这个例子看起来很糟糕,因为三角形很小。

又是小三角形

图 3(上图):另一个带有小三角形但网格大得多的示例。注意边缘有多少东西弯曲。细分级别为 4 时看起来仍然不错。

真的大三角形不好

图 4(上图):另一个大三角形示例,仅显示中心 4 列,因为如果存在更多列,则图像难以理解。这表明非常大的三角形无法很好地细分。如果我将曲面细分设置得非常高,那么效果会很好。但后来我也在较小的三角形上进行了大量的镶嵌。

0 投票
2 回答
1964 浏览

opengl - Opengl 地形和曲面细分着色器

两个问题:

  1. 现代游戏如何设置地形顶点?他们是否将高度图图像附加到纹理,然后使用它来设置每个顶点位置,或者他们只是使用 3D 软件(如 Blender)创建包含这些顶点的文件,然后将其读取到 VBO?如果我的掌握不正确,请纠正我。

  2. 曲面细分着色器对这个过程有多重要?它们只是节省了性能,还是也改变了观众的场景?

0 投票
1 回答
801 浏览

c# - 将原始三角形分割成更小的三角形

我正在使用带有 Helix Toolkit 的 WPF 渲染管道。我意识到提供的函数会生成对我来说太大的三角形图元。

在此处输入图像描述

例如,如果红色三角形是我的图元,我想控制(比如说)三角形的中间部分。我能想到的一种方法是将红色三角形进一步拆分为蓝色三角形,如图所示。谁能指出允许这种拆分的方法或算法?

0 投票
1 回答
1273 浏览

glsl - 镶嵌着色器绘制问题

我目前正在尝试将曲面细分着色器添加到我的程序中,但我觉得我已经无计可施了。我已经阅读了几个教程,并在这里研究了很多问题。不幸的是,在这一切之后,我仍然不明白我做错了什么。我很乐意接受任何提示,并且承认我在这里完全是新手。我的顶点和片段着色器可以工作,但无论我的代码基于哪个教程,一旦添加了曲面细分着色器,我就无法显示任何内容。在加载、链接或使用着色器/程序时,我也没有收到任何错误。

有问题的四个着色器:

顶点:

镶嵌控制着色器:

细分评估着色器:

片段着色器:

我确定我在这里忽略了一些非常简单的东西,但我在这里完全不知所措。感谢您抽时间阅读。

0 投票
1 回答
423 浏览

opengl - Sphere Tessellation 坐标错误

我正在尝试在 GPU 上为一个简单的球体应用细分。这种镶嵌非常适合简单的计划,但不适用于球体。当然,我知道坐标映射不一样,我尝试了很多方法来做到这一点。例如,我尝试在曲面细分评估中使用 gl_TessCoord(x 和 y)作为映射到平面的经度和纬度。然后将它们转换为球坐标,但它“真的”没有用。

对于镶嵌控制,我只是将所有补丁分成 2 个用于外部和 2 个以及内部级别。

这是我绘制球体的代码:

这是我在镶嵌评估中的当前代码:

以下是指数:

int indPtr = 0;

为了绘制球体,我遵循了这个例子:使用 Visual C++ 在 Opengl 中创建一个 3D 球体,所以所有的功劳都归于他(顺便谢谢你!)。

这是显示结果的两张图片:

拳头形象 在此处输入图像描述

如果您有任何可以帮助我解决此问题的提示,那就太好了。谢谢你。注意:如果您需要任何其他信息,请询问我,我会发布它们。

0 投票
1 回答
797 浏览

opengl - 球体镶嵌新的基元位置

我正在尝试让 LOD 与曲面细分着色器一起使用。我有一个简单的球体,一开始有 5 个环和 5 个扇区。我希望球体在相机接近时增加其细节。但是镶嵌生成的新基元被映射在一个平面上,我试图改变那里的位置,但我无法让它工作。这是问题的说明:
在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

如您所见,当相机接近时,我没有得到球体。这是我在球体附近时想要得到的:

在此处输入图像描述

这是镶嵌评估着色器中的代码:

几何着色器:

谢谢您的帮助 !如果您需要其他任何东西,请问我,我会发布它。

0 投票
1 回答
111 浏览

opengl - 如何在 Tessellation Control Shader 中访问同一补丁中的所有顶点

我想在 Tessenllation Control Shader 中做 LOD。而我的方法是计算每个patch在屏幕坐标上所占的面积,并为它们设置不同的细分级别。

所以我需要访问一个补丁中的所有顶点,我这样做如下:

我在 TCS 中定义了我的补丁,例如:

这是OpenGL中的相关代码:


但是结果很奇怪。曲面细分级别与屏幕上的区域有关,但所有补丁都具有相同的曲面细分级别。

所以有什么问题?

我想这是我尝试访问补丁中顶点的方式出错了。那我该怎么做呢?

以下是我的 Tessellation Control Shader 中的代码,希望对您有所帮助:

0 投票
1 回答
381 浏览

c++ - 镶嵌结果闪烁 - OpenGL/GLSL

我正在尝试基于教程实现一个简单的曲面细分程序。

这些是我的着色器:

顶点:

镶嵌控制:

镶嵌评估器:

几何学:

分段:

我面临的问题似乎与类似,其中当 tess 级别变高时,表面开始闪烁。但是,到目前为止我无法解决它。

要画画,我很简单:

这些是我的结果:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

0 投票
2 回答
1255 浏览

geometry - 在矩形上镶嵌六边形

我有一个无限的六边形网格,由三次(xyz)坐标系定义,如下所示:

相互间隔 120 度的 3 条线,分别标记为 x、y 和 z,以及使用这些轴的六边形蜂窝图案。

我还有一个视口——一个矩形画布,我将在其中绘制六边形。

我的问题是这个。因为六边形网格在各个方向上都是无限的,所以我无法一次绘制所有这些。因此,我需要绘制视口中的所有六边形,并且只绘制那些六边形。

这张图片总结了我想要做的事情:

在矩形视口内相交的六边形被着色为紫色并因此被渲染,所有其他六边形不被渲染并在图中被着色为白色

在这张图片中,紫色的六边形是我想要渲染的,而白色的六边形是我不想渲染的。黑色矩形是视口——与它相交的所有六边形都将被绘制。我如何找到要渲染的六边形(即它们的 xyz 坐标)?

其他一些信息:

  • 我有一个函数可以调用一个六边形图块,并在给定其三次 xyz 坐标的情况下将其绘制在视口中的位置(x,y)处。因此,我只需要绘制每个矩形的 xyz 坐标,我就可以绘制它们。这可能会简化问题。
  • 我有从立方六边形坐标转换为 x/y 坐标并返回的公式。鉴于上图,r/g/b 是上图的三次坐标轴,x 和 y 是笛卡尔坐标,s 是六边形边的长度...

    /li>
0 投票
2 回答
348 浏览

shader - 错误 X3502:缺少 ds_5_0 测试因子

我从我的着色器中收到上述错误。船体着色器代码片段:

以及来自我的域着色器的片段,错误来自:

任何帮助,将不胜感激。