Я посылаю треугольник вниз по трубопроводу и хочу его тесселить в прокладку серпинского. Похоже, это было бы намного проще с созданием геометрического шейдера, поэтому, пожалуйста, скажите мне, если идея сделать это с помощью тесселяционных шейдеров просто неверна.Как идентифицировать идентификатор текущей вершины на этапе TES?
Во время контроля тесселяции я проверяю ID на 0-11
и сохраняю положение и цвет вершины в позиции текущего идентификатора.
Я определяю glPatchParameteri(GL_PATCH_VERTICES, 3);
и layout(vertices = 12) out;
для моего шейдера управления тесселяцией, так как каждый треугольник тесселирован в 4 треугольника.
Похоже, что во время моей шейдерной оценки шейдеров массивы in vec3 tcPosition[];
и in vec3 tcColor[];
содержат правильные значения 12
в правильном порядке. Однако: как я могу связать их правильно во время оценки? Есть ли что-то вроде gl_primitiveID
во время оценки тесселяции? Мне нужна замена для gl_primitiveID
, которая равна 0
для всех сгенерированных вершин, поскольку они порождены из одного и того же патча. В настоящее время я просто использую информацию из первых трех вершин (0
, 1
, 2
), но мне нужно будет сменить эти индексы на 3 после каждого сгенерированного треугольника.
void main(){
vec3 p0 = gl_TessCoord.x * tcPosition[0];
vec3 p1 = gl_TessCoord.y * tcPosition[1];
vec3 p2 = gl_TessCoord.z * tcPosition[2];
tePosition = p0 + p1 + p2;
teColor = gl_TessCoord.x * tcColor[0] + gl_TessCoord.y * tcColor[1] + gl_TessCoord.z * tcColor[2];
gl_Position = mvp * vec4(tePosition, 1);
}
Любые идеи или идеи, как умно мозаике треугольника такие, что я позже возможность использовать преобразование обратной связи для пинг-понга рендеринга высоко ценятся.
Благодарим вас за подробный отзыв. Это помогло мне не вкладывать дополнительные дни в попытку найти способ сделать работу тем, что не может работать. Я буду продолжать работу с GS, как я знаю, для количества уровней рекурсии, в которых я нуждаюсь, это может быть сделано вместе с рендерингом пинг-понга (один проход испускает 12 вершин на треугольник, а затем результат считывается с обратной связью преобразования, а затем начинается полностью новая итерация). – NoxMortem
@NoxMortem: «* один проход испускает 12 вершин на треугольник, а затем результат считывается с обратной связью преобразования, затем начинается совершенно новая итерация *« ... В этот момент было бы быстрее использовать процессор. Все, что останавливается, прежде чем вы сможете начать следующую итерацию, будет медленнее, чем оптимизированный алгоритм процессора. Или, по крайней мере, вы можете использовать Compute Shader. –