光栅化过程中顶点是否被丢弃?如果是,如何防止?

Are vertices getting discarded during rasterization and if so how to prevent it?

我正在尝试创建斯坦福龙的 2D 像素化,稍后我将扩展到 3D 体素化。

理想的输出是这样的:

此图像是使用以下几何着色器生成的:

#version 440

layout (triangles) in;
layout (triangle_strip, max_vertices=136) out;

in vec3 v_pos[];
in vec3 v_norm[];
in vec2 v_uv[];

out vec3 f_pos;
out vec3 f_norm;
out vec2 f_uv;

void main()
{
    vec3 side1 = v_pos[0] - v_pos[1];
    vec3 side2 = v_pos[1] - v_pos[2];

    vec3 tNorm = abs(cross(side1,side2));
    for(uint  i=0; i<3; i++)
    {
        f_pos = v_pos[i]/10;
        f_norm = v_norm[i];
        f_uv = v_uv[i];
        if(tNorm.x>tNorm.y && tNorm.x>tNorm.z)
        {
            gl_Position = vec4(f_pos.y, f_pos.z, 0, 1);
        }
        else if(tNorm.y>tNorm.x && tNorm.y>tNorm.z)
        {
            gl_Position = vec4(f_pos.x, f_pos.z, 0, 1);
        }
        else
        {
            gl_Position = vec4(f_pos.x, f_pos.y, 0, 1);
        }
        EmitVertex();
    }
    EndPrimitive();
}

和片段着色器:

#version 440

in vec3 f_pos;
in vec3 f_norm;
in vec2 f_uv;

uniform layout(binding=0, rgba8) image3D image;

out vec4 fragment_color;

void main()
{
    imageStore(image, ivec3(f_pos.xy*50 + vec2(100),0), vec4(1,0,1,1));

    fragment_color = vec4(1,1,1,0);
}

尽管这创建了一条非常小的龙,但我创建的完整纹理如下所示:

因此,我试图通过较小的因子来缩放龙以制作更大的图像,但是这会导致以下图像的分割因子为 3 (f_pos = v_pos[i]/3;):

如你所见,大部分的龙都在那里,但是有很多洞。

我相信发生这种情况是因为在几何着色器中计算的某些顶点在 (-1,1) 有效坐标范围之外结束,因此被丢弃,产生了孔。

有没有办法指示着色器在光栅化过程中不要丢弃超出所述范围的顶点?

着色器不丢弃顶点; post-transform rendering stage does。它是渲染工作方式的基本部分,如果不方便,您不能简单地将其关闭。

您必须生成在 clip-space 范围内的图元。如果你想要更大剪辑的效果 space,那么你必须在光栅化之前按比例缩小并在片段着色器中反转缩放。