问题标签 [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 回答
419 浏览

c++ - 地形镶嵌和深度缓冲

我正在做一些地形渲染,我遇到了一些麻烦。在这个时间点,我只是对顶点补丁进行细分,然后用高度图替换它们。我目前的问题是渲染看起来很时髦。我已经调试了一段时间,看起来这是深度缓冲区的问题。过去,我对正在发生的事情没有任何想法。

这是我使用 VS 图形调试获取的深度缓冲区的图像。真的不确定使用调试器显示这个的最佳方式,所以我抓住了红色通道和绿色通道的图像 1 1.5

这是后备缓冲区 2

据我了解,更近的像素应该比更远的像素颜色更深。正如您在比较第二张和第三张图像时看到的那样,似乎正在发生相反的情况。我是误解了什么还是发生了什么奇怪的事情。

任何想法或指向一个方向将非常感激,因为我没有想法。

我将发布我如何为可能的问题设置深度缓冲区:

以下是我设置深度模板状态和光栅状态的方法:

然后我确实在使用它们

这是我设置深度缓冲区的方法:

编辑:

添加更多图像,可能会更好地显示问题:

图像 图像

0 投票
1 回答
2493 浏览

c++ - GLSL 中曲面细分着色器的链接错误

我正在从链接http://prideout.net/blog/?p=48#shaders测试三角形镶嵌。所有着色器均已正确编译,但是当我尝试使用以下命令链接程序时:

我收到以下错误:

太奇怪了,我使用命令声明 TC Shader 的输出:

并使用命令为 TE 着色器输入布局:

为什么我仍然收到此错误?我希望看到你回答它。

我把我的着色器放在下面:

顶点着色器:

TC着色器:

TE着色器:

几何着色器:

片段着色器:

最后,这是我设置着色器源的代码:

编译所有着色器后,我链接程序

//并再次检查错误:

//我在这里得到了错误,如上所述。

0 投票
1 回答
266 浏览

direct3d - 防止单个 ERG 的像素着色器过度绘制

背景

使用 gluTess 从 GDI+ DrawString(..) 路径在 Direct3D9 中构建三角形列表:

镶嵌文本

然后使用像素着色器 (v3.0) 填充形状。使用不透明值进行绘制时,一切看起来都很好:

不透明的输出

问题

在某些字体大小下,如果颜色具有 alpha 分量(即 Argb #55FFFFFF),我们开始看到这些令人讨厌的曲面细分伪影,其中三角形可能会略微重叠:

透明输出

在较大的字体大小时,有时不存在问题:

大字体测试

使用 Intel 优秀的 GPA Frame Analyzer Pixel History 工具,我们可以看到在出现伪影的区域,像素已经从单个 Erg 中“触摸”了 3 次。

尔格分析

我试图弄清楚如何阻止我的像素着色器多次触摸同一个像素。

其他与防止过度绘制相关的解决方案似乎都是关于 zbuffer 策略的,但是这个问题更多地与在单个像素着色器通道中绘制单个 2D 三角形列表有关。

我在试图想出一个解决方案时有点不知所措。我希望 HLSL 可能有某种“每个像素只触摸一次”标志,但我一直找不到类似的东西。我发现最接近的是将 BLENDOP 设置为 MAX 而不是 ADD。但是当混合场景中的其他颜色时,输出不正确。

我也有 SRCBLEND = ONE,DSTBLEND = INVSRCALPHA。产生正确输出的唯一标志组合(尽管有过度绘制的工件。)

我在 GPA 帧分析器中使用过 SEPARATEALPHABLENDENABLE,这听起来几乎正是我在这里需要的——将混合设置为 MAX,但仅在“alpha”通道上,但据我所知,该设置(和相应的 BLENDOPALPHA)会影响什么都没有。

我想到的最后一件事是将不透明的文本烘焙到纹理上,然后使用适当的 alpha 值将该纹理重新绘制到场景中,但这实际上在这个项目中不起作用,因为我还支持渐变画笔,在哪里停止值可能包含 alpha,这意味着如果我们在烘焙到纹理之前将 alpha 从停止值中剥离出来,则仍然可以看到伪影,或者最终输出完全错误。此外,整个努力将非常昂贵。

任何提示或指针将不胜感激。谢谢阅读。

0 投票
1 回答
2521 浏览

c++ - DirectX 大平面细分

只是一个关于 DirectX11 Tessellation 的问题。

在 Hull Shader 中,可以设置的最大细分因子为 64(不知道为什么)。现在虽然这对于小型飞机来说已经足够了,但对于大型飞机来说,这还不够,所以我想知道如何渲染大型飞机?

以下代码生成我的四边形,R半径在哪里:

我确实修改了它,将它放在一个循环中以生成多个四边形,比如在 3x3 网格中。但是,当我将它传递给曲面细分着色器时,它对第一个四边形效果很好,但其他四边形却搞砸了。

这是我渲染环形平面时的样子:

为什么在使用多个四边形时不能正确镶嵌?我是否应该通过在我的图形类中创建一个循环来解决这个问题,然后我会一遍又一遍地翻译和渲染同一个四边形以创建一个网格?

希望这是有道理的。

0 投票
1 回答
2942 浏览

c++ - GLSL/OpenGL 着色器曲面细分闪烁和失败

我刚开始使用 OpenGL 曲面细分,遇到了一些麻烦。我正在细分由一个顶点形成的一系列补丁。这些顶点/补丁以类似网格的方式构造,以便稍后形成由 Perlin Noise 生成的地形。

我遇到的问题是,从第二个补丁开始,之后的每 5补丁,有时会有很多镶嵌(不是我配置的方式),但大多数时候它根本没有镶嵌。

像这样:

  

两个白色圆圈标记高度/过度镶嵌的补丁。还要注意未镶嵌补丁的模式。

奇怪的是,它可以在我的 Surface Pro 2(Intel HD4400 显卡)上运行,但在我的主台式电脑(AMD HD6950 显卡)上却存在错误。有没有可能是硬件坏了?

补丁是使用以下代码生成的:

并绘制:

顶点着色器:

控制着色器:

评估着色器:

片段着色器:

我试图对不同的细分级别进行硬编码,但这没有帮助。我最近开始使用 OpenGL,所以如果我在做一些愚蠢的事情,请告诉我。

那么有没有人知道是什么导致了某些补丁的“闪烁”?

更新:我有一个朋友运行该项目,他得到了相同的闪烁镶嵌图案,但除了过度镶嵌外,根本没有绘制失败的补丁。他的显卡和我一样(AMD HD6950)。

0 投票
1 回答
1735 浏览

c - 简单平面细分着色器

第1部分:

所以我想创建一个基本的镶嵌程序,它采用一个四边形平面并将其转换为一个更详细/细分的四边形平面。比如下图。镶嵌多少取决于用户控件,由制服(最初)传入。但是我对镶嵌着色器太陌生了,我什至不知道如何做到这一点。

平面镶嵌

这通常是如何完成的?当然,您实际上不应该在着色器程序之前绘制四边形平面,因为根据我的理解,四边形不会以这种方式细分,而是以如下图所示的方式细分:

四边形镶嵌

我相信答案可能是绘制一个点平面,然后将这些点细分为更多点,然后这些点在我认为的几何着色器中转换为适当大小的四边形?或者,我可以在每四个最近点之间绘制四边形,而不是将点转换为四边形(那会更好)?例子非常感谢!

注意:仅使用 GLSL > 4.0 和 C(无 C++/Python)

第2部分:

在我开始第 1 部分工作后,我将如何使某些四边形比其他四边形更加镶嵌,例如这样?:

在此处输入图像描述

我希望靠近相机的部分更加细分。

第 3 部分:

如果我能走得那么远,下一步就是改变点的 z 轴,使飞机变成一个有趣的环境。这将通过阅读 2Dsampler 来完成,我知道如何做到这一点。但是,如果我在第 1 部分中关于使用点平面是正确的,那么我需要做的不仅仅是改变转换为四边形的点,因为四边形需要共享顶点,以便在四边形之间没有间隙。那怎么做?或者,如果我们在点之间绘制四边形,每个点都是适当的高度,那么这将不是问题。

0 投票
2 回答
763 浏览

geometry - 将三角形三角化成网格

是否有一种算法可以将可能跨越多个网格元素的三角形划分为多个三角形,其中没有跨越多个网格元素的三角形?

我在 2x2 网格中包含了一个糟糕的手绘三角形,该网格被切成七个较小的三角形。

之前和之后

0 投票
3 回答
973 浏览

c - 在OpenGL中绘制一个凹多边形(错误)

我正在尝试使用 C 中的 OpenGL 绘制 L 形多边形。据我说,这段代码应该这样做,但它并没有给我预期的结果。我要绘制的形状类似于下面。发生错误的点是函数polygon1 中的点2。

我似乎在这里犯了一些错误,还是 OpenGL 中的错误。下图是红色错误输出,下面绘制的图表是代码的预期输出。

在此处输入图像描述


0 投票
3 回答
1241 浏览

opengl - GLSL 镶嵌环境 - 补丁之间的间隙

所以我一直在编写一个程序,它使用曲面细分着色器和高度图来绘制环境。它以 32x32 平面开始,当它变得更加细分时,每个正方形顶点的高度由高度图确定。

我想要它,以便补丁离相机越近,它就越镶嵌。但是,我发现这会导致补丁之间出现间隙。如果补丁比旁边的补丁更细分,则不同的分辨率会导致间隙。

在这里,一张图胜过千言万语: 镶嵌环境 镶嵌环境

如果两个补丁具有相同的分辨率,则没有间隙。我怎样才能解决这个问题?我完全被困住了。

0 投票
1 回答
425 浏览

c++ - 具有细分的渲染多边形计数

我想知道当硬件镶嵌打开时是否有办法获得渲染到窗口的有效多边形(或顶点)的数量。由于自适应细分,多边形数量从一帧到下一帧发生变化。

我正在使用 OpenGL 4.2 并渲染调用 glDrawElements 的网格。我正在使用完整的程序着色器(顶点、镶嵌控制、镶嵌评估、几何和片段)。

我有一个数组中的初始多边形数量,但是在执行镶嵌阶段之后,这个数字不再有效。

我尝试使用 glGetQuery(GL_PRIMITIVES_GENERATED) 但它总是返回 0。