@SergeySerge11

Как реализована растеризация треугольников в opengl итд?

Реализовал несколько тысяч строк кода для всех возможных типов параметров наложения цветов, текстур, fun strip ... .... Вопрос не в этом.
Я не могу понять, по запросу в сети или gpt, обычно выдается 2 типа ответов.
1. Алгоритмы отрисовки треугольника, берется треугольник и рисуется, по линиям, все понятно, любой учебник.

2. А вот это не понятно, . Берется пиксель и для этого пикселя проверяется весь массив треугольников.
Или как на сайттах с шейдерами, вообще не чего не проверятся, на функцию шейдера приходят точные координаты цвета пикселя, откуда, и вообще просто знак равно напиши или знак +=... , без какой либо геометрии. типа как-будто пиксель знает какого цвета он будет
Какая реализация у функций. glDrawArrays точнее хотя бы знать там по чему gpu многопоточится, по точкам экрана или вершинам
А еще есть технология RayTracing, а в ней вообще рисуются примитивы? Тогда куда и зачем, если как бы потом rayTracing проведет по всем пикселям экрана лучи и найдет ту же точку повторно.
И что вообще означает поддержка ray tracing на видеокартах если это просто обычный код мат операций y=a*x+b?
//псевдокод
1:
 for triangle in triangles 
     drawTriangle();
2:
for pixels  in pixels 
     drawPixel(triangles);
  // допустим там можно окто дерево какое-нибудь передать, ускорить поиск.  неужели это быстрее?


И как работает конвейр рендеринга, все этапы они прям строго нестрого последовательны, или так условно обозначены.
То есть пока некоторый этап до не выполнился следующий не начнется?
Вот есть этап Растеризации а есть какой это Pixel shading ? А как такое возможно? Ведь на растеризации вычисляется значение цвета некоторого пикселя
допустим есть функция
for (int y = (int)p1.Y; y >= (int)p0.Y; y--)
 {
     int beg = (int)left.Value + y * width;
     int end = (int)right.Value + y * width; 
     Linear2d lineTexture = new Linear2d()
     {
         b = leftTexture.Point,
         a = (rightTexture.Point - leftTexture.Point) * (1f / (end - beg + 1))
     }; 
     for (int x = beg; x <= end; x++)
     { 
        // if (zBuffer[x] <= index)
         { 
             int xT = (int)lineTexture.Point.X;
             int yT = (int)lineTexture.Point.Y;
  /// ВОТ  тут отрисовка пикселя.     К примеру просто    imageBuf[addr]=color; 
             TSetPixels.SetPixel<TBlur>(ref imageBuf, zBuffer, texture.GetColor<TColor>(yT * wTexture + xT), indexZ, addr:x); 
         }
         lineTexture.Increment();
     }
     left.Decrement();
     right.Decrement();
     leftTexture.Decrement();
     rightTexture.Decrement();
 }

Вот пример, кода, Если делать все по этапам, Я типа не имею право закрашивать пиксель на этом этапе? Это же типа этап растеризации наверное.
Типа я должен заменить функцию SetPixel() на Push в какой-то массив(а это сразу для каждого пикселя нужен возможно бесконечный массив длинной, для случая, если все объекты в одной точке, а 90% пикслей будут в 1 длинной), и после пройтись еще, в логике разделения? Очевидно что это неправильно, наверное. А тогда выходит я не особо понимаю конвейер.
Или есть какая-то магическая функция, что-то такое магическое из разряда квантовых алгоритмов,, хеширования и супер жесткой математике. Что по трем точкам вершин можно сразу найти некую функцию которая для точки по индексу ([0...x],[0....y]) вернет ее цвет. И вместо прохождения по всем точкам треугольника. можно как это эти функции компилировать на лету. просто вычислив значения для вершин.
  • Вопрос задан
  • 40 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы