Opengl 几何体着色器体素化错误

Opengl 几何体着色器体素化错误,opengl,graphics,shader,voxel,geometry-shader,Opengl,Graphics,Shader,Voxel,Geometry Shader,我正在尝试制作一个几何体着色器(使用着色器生成器)来简化模型。首先,我试图做一个体素化,但结果不好,我找不到它的错 在下面的代码中,想法是找到输入三角形的中心,然后使其成为我要创建的框的中心 我知道这并不是世界上最优雅的代码,但第一步是第一步,我需要让它工作 这就是我得到的: 这是我应该得到的: uniform float stepi; void main( void ){ float step = stepi/2.; vec3 bari = {(gl_PositionIn

我正在尝试制作一个几何体着色器(使用着色器生成器)来简化模型。首先,我试图做一个体素化,但结果不好,我找不到它的错

在下面的代码中,想法是找到输入三角形的中心,然后使其成为我要创建的框的中心

我知道这并不是世界上最优雅的代码,但第一步是第一步,我需要让它工作

这就是我得到的: 这是我应该得到的:

uniform float stepi;

void main( void ){

    float step = stepi/2.;

    vec3 bari = {(gl_PositionIn[0].x + gl_PositionIn[1].x +gl_PositionIn[2].x)/3,
(gl_PositionIn[0].y + gl_PositionIn[1].y +gl_PositionIn[2].y)/3,
(gl_PositionIn[0].z + gl_PositionIn[1].z +gl_PositionIn[2].z)/3};

    vec3 bar = bari;

    float dist = 0;

    for( int i = 0 ; i < gl_VerticesIn ; i++ )
    {
        gl_FrontColor  = gl_FrontColorIn[ i ];
        gl_TexCoord[0] = gl_TexCoordIn  [ i ][ 0 ];
//-x
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z+step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z+step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z-step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z-step,1) ;
        EmitVertex();
EndPrimitive();

//-y
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z+step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z+step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z-step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z-step,1) ;
        EmitVertex();
        EndPrimitive();

//-z
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z-step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z-step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z-step,1) ;
        EmitVertex();
EndPrimitive();
//+x
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z+step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z+step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ;
        EmitVertex();
EndPrimitive();

//+z
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z+step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z+step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z+step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z+step,1) ;
        EmitVertex();
EndPrimitive();

//+y
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z+step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z+step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z-step,1) ;
        EmitVertex();
        gl_Position    = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ;
        EmitVertex();
        EndPrimitive();

    }
}
uniformfloat-stepi;
真空总管(真空){
浮动步长=步长i/2。;
vec3 bari={(gl_PositionIn[0].x+gl_PositionIn[1].x+gl_PositionIn[2].x)/3,
(gl_PositionIn[0]。y+gl_PositionIn[1]。y+gl_PositionIn[2]。y)/3,
(gl_PositionIn[0].z+gl_PositionIn[1].z+gl_PositionIn[2].z)/3};
vec3巴=巴里;
浮动距离=0;
对于(int i=0;i
我认为问题在于您以错误的顺序发射顶点。基本体的顶点应按顺时针顺序发射(从网格外部的角度)。例如,在+z四边形上,按以下顺序发射顶点(左上)、(左下)、(右上)、(右下),但它应该是(左上)、(右上)、(右下), (左下角)


此外,您应该保留for循环中的代码,但要去掉循环本身。每次运行几何体着色器时,应仅发射一个立方体。现在您正在多次发射同一个立方体。

它现在工作正常,主要问题是计算立方体的中心(以及形成立方体的顶点的实际配置)

中心编号的计算方法如下:

    vec3 bari = vec3((gl_PositionIn[0].xyz+gl_PositionIn[1].xyz+gl_PositionIn[2].xyz)/3);

vec3 centre = floor((bari/stepi)+(0.5,0.5,0.5));
centre = centre * stepi;
其中bari是三角形的中心,center是立方体的中心。这不是最好的解决方案,因为在某些形状中会出现孔,但这是我得到的结果


谢谢大家的回答!

您使用的是什么基本体类型,三角形还是四边形?是的,根据基本体的不同,对三角形进行体素化可能会显得很奇怪。例如,一个四边形由两个三角形组成。一个三角形的质心将略低于另一个三角形,生成的体素看起来可能会相互偏移沿着所有的轴。至少这是直觉的猜测。“这是我应该得到的:”你的算法不能做到这一点。仅仅在三角形的中心创建一个立方体并不能达到你想要的效果。请看我修改后的答案。实际上Z的顺序是正确的。你可以通过循环找到正确的位置。最后我让它工作起来,主要问题是我需要区分立方体形成的位置。现在它工作了很好!谢谢你只是好奇,你在使用人脸剔除(glFrontFace()吗)​/glCullFace()​/glEnable(GL_CULL_FACE))?我不知道