繁体   English   中英

简单的平面曲面细分着色器

[英]Simple Flat Plane Tessellation Shader

第1部分:

所以我想创建一个基本的曲面细分程序,它采用一个四边形平面并将其转换为一个更详细/细分的四边形平面。 比如下图。 它被细分的程度取决于用户控件,由统一(最初)传入。 但是,我对曲面细分着色器非常陌生,以至于我什至不知道如何执行此操作。

平面镶嵌

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

四曲面细分

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

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

第2部分:

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

在此处输入图片说明

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

第 3 部分:

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

第1部分

是的,您是对的:将“补丁”生成为简单的点网格,将曲面细分级别指定为 TCS(曲面细分控制着色器)中的制服,并在 TES(曲面细分评估着色器)中生成顶点数据。

听起来很复杂? 这是我基于我的工作的一个很好的教程: http : //antongerdelan.net/opengl/tessellation.html

第2部分

你在这里谈论的是 LOD(或细节级别)。 您需要将网格的左下角多边形计数较高的部分细分并渲染为一个单独的对象。

您建议的方法是正确的:将整个场景分成“块”并分别确定每个块的 LOD(即细分参数),通常是通过某种距离到相机的算法。

第 3 部分

另一个出色的教程,我相信它完全符合您的要求: http : //codeflow.org/entries/2010/nov/07/opengl-4-tessellation/

我使用这种方法来获得非常详细但内存和帧效率高的地形。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM