【问题标题】:Are vertices getting discarded during rasterization and if so how to prevent it?在光栅化过程中顶点是否被丢弃,如果是,如何防止它?
【发布时间】:2018-05-21 19:44:43
【问题描述】:

我正在尝试创建斯坦福龙的 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) 有效坐标范围,因此被丢弃,从而产生了孔。

有没有办法指示着色器在光栅化期间不要丢弃所述范围之外的顶点?

【问题讨论】:

    标签: opengl graphics glsl textures voxel


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-03-28
      • 2012-08-18
      • 2012-06-02
      • 2016-03-31
      • 1970-01-01
      • 2021-12-28
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多