首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于简单距离的镶嵌中的T形交汇点

基于简单距离的镶嵌中的T形交汇点
EN

Stack Overflow用户
提问于 2021-02-27 21:10:58
回答 1查看 41关注 0票数 1

我使用openGL中的镶嵌控制/评估着色器实现了一个简单的基于距离的细节细节,用于未来的地形渲染。令人惊讶的是,我的输出中仍然有裂缝(T形接头)...着色器代码为

代码语言:javascript
复制
uniform mat4 pvmM;
uniform vec4 u_camerapos;

#ifdef TESSELATION_CONTROL_SHADER
layout(vertices = 4) out;

unsigned int dist(vec3 p1,vec3 p2,vec3 p3)
{

    float d=distance((p1+p2)/2.0,p3); // precise float d=(...)
    if (d<1.5) return 64;
    if (d<2.5) return 32;
    if (d<3) return 16;
    if (d<4) return 8;
    if (d<5) return 4;
    if (d<6) return 2;
    return 1;
}

void main() {
    if (gl_InvocationID == 0){
        gl_TessLevelOuter[0] = dist( gl_in[3].gl_Position.xyz,gl_in[0].gl_Position.xyz,u_camerapos.xyz);
        gl_TessLevelOuter[1] = dist( gl_in[0].gl_Position.xyz,gl_in[1].gl_Position.xyz,u_camerapos.xyz);
        gl_TessLevelOuter[2] = dist( gl_in[1].gl_Position.xyz,gl_in[2].gl_Position.xyz,u_camerapos.xyz);
        gl_TessLevelOuter[3] = dist( gl_in[2].gl_Position.xyz,gl_in[3].gl_Position.xyz,u_camerapos.xyz);
        float mean=floor((gl_TessLevelOuter[0]+gl_TessLevelOuter[1]+gl_TessLevelOuter[2]+gl_TessLevelOuter[3])/4.0);
        gl_TessLevelInner[0] = int(mean);
        gl_TessLevelInner[1] = int(mean);
        }
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;  
    }
#endif
#ifdef TESSELATION_EVALUATION_SHADER
void main() {
    vec4 p1 = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);
    vec4 p2 = mix(gl_in[2].gl_Position, gl_in[3].gl_Position, gl_TessCoord.x);
    gl_Position = pvmM*mix(p1, p2, gl_TessCoord.y);
    }
#endif

使用python:顶点和索引是使用

代码语言:javascript
复制
blocksz=8
vertices=np.array([(x,0,z) for z in range(blocksz) for x in range(blocksz)],dtype='f4')
vertices=vertices-np.array([blocksz/2,0,blocksz/2])
faces= np.array([(x+z*blocksz,x+1+z*blocksz,x+(z+1)*blocksz,x+1+(z+1)*blocksz ) for z in range(blocksz-1) for x in range(blocksz-1)  ],dtype='i4')

并使用以下命令绘制

代码语言:javascript
复制
glDrawElements(GL_PATCHES,count,GL_UNSIGNED_SHORT,None)

在下图中,

您可以看到结果。一些T形接头出现在x轴上(左-右,例如第一列和最后一列),但从不出现在z轴上(顶部引导)。虚拟摄像机由红点表示,其位置为均匀传递。

其余的一切都像预期的那样工作。你知道我误解了什么吗?

EN

回答 1

Stack Overflow用户

发布于 2021-02-28 15:50:55

好了,找到bug了。在生成索引数组(faces)时,我使用了错误的缠绕(与GL_QUAD_STRIP的缠绕相同)。正确的faces数组应该是:

代码语言:javascript
复制
faces= np.array([(x+z*blocksz,x+1+z*blocksz,x+1+(z+1)*blocksz,x+(z+1)*blocksz ) for z in range(blocksz-1) for x in range(blocksz-1)  ],dtype='i4')

然后,在tess求值着色器中(注意翻转点2和3

代码语言:javascript
复制
vec4 p1 = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);
vec4 p2 = mix(gl_in[3].gl_Position, gl_in[2].gl_Position, gl_TessCoord.x);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66399144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档