Отбрасываются ли вершины во время растеризации, и если да, то как это предотвратить? - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь создать 2D пикселизацию Стэнфордского дракона, которую я позже расширю до 3D вокселизации.

Идеальный результат выглядит следующим образом:

enter image description here

Это изображение создается с использованием следующего геометрического шейдера:

#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);
}

Как бы это ни создавало действительно маленького дракона, полная текстура, которую я создал, выглядит следующим образом:

enter image description here

Поэтому я попытался масштабировать дракона с меньшим коэффициентом, чтобы получить большее изображение, этооднако результат на следующем рисунке для коэффициента деления 3 (f_pos = v_pos[i]/3;):

enter image description here

Как вы можете видеть, большая часть дракона существует, но дыр много.

Я полагаю, это происходит потому, что некоторые вершины, вычисленные в геометрическом шейдере, заканчиваются за пределами (-1,1) допустимого диапазона координат и, таким образом, отбрасываются, создавая дыры.

есть ли способ указать шейдерам не сбрасывать вершины за пределами указанного диапазона во время растеризации?

1 Ответ

0 голосов
/ 21 мая 2018

шейдеры не сбрасывают вершины; стадия рендеринга после преобразования делает .Это фундаментальная часть того, как работает рендеринг, и вы не можете просто отключить его, если это неудобно.

Вы должны генерировать примитивы, которые находятся в пределах пространства клипа.Если вы хотите получить эффект увеличения пространства клипа, то перед растеризацией нужно уменьшить масштаб и обратить вспять масштабирование в фрагментном шейдере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...