给定一个用三角形镶嵌的补丁,如何修改它的新顶点位置?

Posted

技术标签:

【中文标题】给定一个用三角形镶嵌的补丁,如何修改它的新顶点位置?【英文标题】:Given a patch tessellated with triangles, how to modify its new vertices positions? 【发布时间】:2018-03-20 12:16:37 【问题描述】:

我通过三角形镶嵌创建了一个镶嵌平面。我想让每个内部新三角形在 y 轴上上下移动,独立于其他三角形。 我想在 TES 或 TCS 中修改他们的 gl_Position 来这样做,但到目前为止我所获得的只是让所有基元同时移动。 我怎样才能实现我的目标?

这是镶嵌平面 [飞机]:https://ibb.co/jWRjvH“”

这是我的 TCS

#version 450 core

layout (vertices = 3) out;

// Input Block
in VS_OUT
    vec2 UV;
 tcs_in[];

// Output Block
out TCS_OUT
    vec2 UV;
 tcs_out[];


void main()



    if(gl_InvocationID == 0)
    
        gl_TessLevelInner[0] = 10.0;
        gl_TessLevelOuter[0] = 10.0;
        gl_TessLevelOuter[1] = 10.0;
        gl_TessLevelOuter[2] = 10.0;
    
    gl_out[gl_InvocationID].gl_Position=gl_in[gl_InvocationID].gl_Position;

    tcs_out[gl_InvocationID].UV = tcs_in[gl_InvocationID].UV;   

这是我的 TES

#version 450 core

layout (triangles, equal_spacing, cw) in;    

// Input Block
in TCS_OUT
    vec2 UV;
 tes_in[];

// Output Block
out TES_OUT
    vec2 UV;
 tes_out;


void main()


    gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position +
                   gl_TessCoord.y * gl_in[1].gl_Position + 
                   gl_TessCoord.z * gl_in[2].gl_Position);


     tes_out.UV = gl_TessCoord.x * tes_in[0].UV + 
                  gl_TessCoord.y * tes_in[1].UV + 
                  gl_TessCoord.z * tes_in[2].UV;

     
 

【问题讨论】:

你不能添加几何着色器,并且在几何着色器之前和之后有一个固定的功能管道阶段,称为输入汇编程序运行。所以基本上几何着色器具有移动、添加、删除顶点或更改拓扑的能力。但请注意几何着色器对性能非常不利,因此我建议添加计算着色器并在其中做你想做的事情。 【参考方案1】:

我想让每个内部新三角形在 y 轴上上下移动,独立于其他三角形。

你不能那样做。 TES 为镶嵌图元生成顶点,但它无法控制图元它们自己。 Tessellation 生成一个三角形场,所有这些三角形相互连接以覆盖area of the abstract patch。如果对三角形进行镶嵌,会得到大量相互连接的三角形,没有办法让它们独立。

至少,只是镶嵌是不可能的。您可以使用细分后几何着色器来完成此操作,该着色器能够作用于独立的图元。

【讨论】:

非常感谢,现在知道了!

以上是关于给定一个用三角形镶嵌的补丁,如何修改它的新顶点位置?的主要内容,如果未能解决你的问题,请参考以下文章

寻找三角形镶嵌的最近邻

为啥我的三角形在镶嵌后不显示? OpenGL

投影三角形的表面积

搅拌机;自定义导出“平面”三角形顶点

如何从相邻顶点UV计算/推导新的顶点UV

飘扬的旗帜!shader 编程实战!Cocos Creator!