MTLTriangleFillModeLines игнорирует вырожденные треугольники? - PullRequest
0 голосов
/ 03 апреля 2020

Итак, в моем приложении есть ситуация, когда я хочу нарисовать полный экран в виде я sh треугольников. Я делаю это с тем, что вы ожидаете. Буфер вершин и индексный буфер, который проходит по этим вершинам.

Когда я отлаживал, я хотел увидеть края этого себя sh, чтобы помочь мне визуально понять, что происходит. Это было, когда я обнаружил это изображение здесь. Это было нарисовано с использованием [encoder setTriangleFillMode:MTLTriangleFillModeLines]; с конвейером, у которого фрагментный шейдер выводит зеленый цвет. Вы можете видеть, что здесь есть диагонали в каждом ряду по любой причине.

enter image description here

Мой вопрос по существу таков. Похоже ли это на случай, когда my me sh просто неверен (возможно, буфер индекса) или MTLTriangleFillModeLines не очень хорошо справляется с вырожденными треугольниками?

Некоторые дополнительные важные детали:

  • Рисование выполняется с помощью drawIndexedPrimitives с MTLPrimitiveTypeTriangleStrip
  • Я использую uint32_t в качестве типа индекса
  • Индексы определяются на основе старого бита примера кода из здесь , поскольку они также разбили экран на меня sh.

Вот копия кода с Github

unsigned int index = 0;
for (int i=0; i<poolHeight-1; i++)
{
    for (int j=0; j<poolWidth; j++)
    {
        if (i%2 == 0)
        {
            // emit extra index to create degenerate triangle
            if (j == 0)
            {
                rippleIndicies[index] = i*poolWidth+j;
                index++;                    
            }

            rippleIndicies[index] = i*poolWidth+j;
            index++;
            rippleIndicies[index] = (i+1)*poolWidth+j;
            index++;

            // emit extra index to create degenerate triangle
            if (j == (poolWidth-1))
            {
                rippleIndicies[index] = (i+1)*poolWidth+j;
                index++;                    
            }
        }
        else
        {
            // emit extra index to create degenerate triangle
            if (j == 0)
            {
                rippleIndicies[index] = (i+1)*poolWidth+j;
                index++;
            }

            rippleIndicies[index] = (i+1)*poolWidth+j;
            index++;
            rippleIndicies[index] = i*poolWidth+j;
            index++;

            // emit extra index to create degenerate triangle
            if (j == (poolWidth-1))
            {
                rippleIndicies[index] = i*poolWidth+j;
                index++;
            }
        }
    }
}

1 Ответ

1 голос
/ 04 апреля 2020

Примитивный перезапуск был бы намного лучшим решением здесь. Таким образом, как указано в Metal drawIndexedPrimitives , размещение примитивного индекса перезапуска в конце каждой строки. Таким образом, новый код должен выглядеть примерно так:

uint32_t degenerate = 4294967295; //0xFFFFFFFF
assert(sizeof(uint32_t) == 4);
unsigned int index = 0;
for (int i=0; i<poolHeight-1; i++)
{
    for (int j=0; j<poolWidth; j++)
    {

        rippleIndicies[index++] = i*poolWidth+j;
        rippleIndicies[index++] = (i+1)*poolWidth+j;
    }
    rippleIndicies[index++] = degenerate;
}
...