Реализовал несколько тысяч строк кода для всех возможных типов параметров наложения цветов, текстур, 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]) вернет ее цвет. И вместо прохождения по всем точкам треугольника. можно как это эти функции компилировать на лету. просто вычислив значения для вершин.