⚡ Программируемое реализация конвейера рендеринга, полная китайская аннотация, помогая новичкам научиться рендеринг принципы.
mkdir build
cmake -S . -B ./build
cmake --build ./build --config ReleaseОбратите внимание, что скопируйте папку Res в путь, в котором находится исполняемый файл.
Просто найдите пример файла, начиная с sample_ и напрямую составьте его с одним файлом GCC:
gcc -O2 sample_07_specular.cpp -o sample_07_specular -lstdc++ Кажется, что мне нужно добавить -std=c++17 к моему Mac. Возможно, вам понадобится добавить -lm для отображения и объявления библиотеки математики ссылки.
бегать:
./sample_07_specular Затем получить файл изображения output.bmp :
Модель этого проекта использует модель с открытым исходным кодом в Tinyrender.
В основном он использует структуру ShaderContext, которая используется для передачи параметров между VS-> PS, и она полна различных типов вариаций.
// 着色器上下文,由 VS 设置,再由渲染器按像素逐点插值后,供 PS 读取
struct ShaderContext {
std::map< int , float > varying_float; // 浮点数 varying 列表
std::map< int , Vec2f> varying_vec2f; // 二维矢量 varying 列表
std::map< int , Vec3f> varying_vec3f; // 三维矢量 varying 列表
std::map< int , Vec4f> varying_vec4f; // 四维矢量 varying 列表
}; Внешний слой должен обеспечить указатель функции на рендеринг VS и вызовать три вершины треугольника последовательно, когда инициализируется функция Renderer DrawPrimitive :
// 顶点着色器:因为是 C++ 编写,无需传递 attribute,传个 0-2 的顶点序号
// 着色器函数直接在外层根据序号读取响应数据即可,最后需要返回一个坐标 pos
// 各项 varying 设置到 output 里,由渲染器插值后传递给 PS
typedef std::function<Vec4f( int index, ShaderContext &output)> VertexShader; Каждый раз, когда называется вызов, рендерератор передает числа 0 , 1 index 2 из трех вершин в программу VS, в свою очередь, для облегчения чтения данных вершины извне.
Рендерер называет пиксельный шейдер за каждую точку, которая должна быть заполнена в треугольнике:
// 像素着色器:输入 ShaderContext,需要返回 Vec4f 类型的颜色
// 三角形内每个点的 input 具体值会根据前面三个顶点的 output 插值得到
typedef std::function<Vec4f(ShaderContext &input)> PixelShader;Цвет, возвращаемый программой затенения пикселей, будет привлечен к соответствующему положению буфера кадра.
Вызов следующий интерфейс может нарисовать треугольник:
bool RenderHelp::DrawPrimitive ()Эта функция является ядром рендеринга.
Затем два слоя для цикла итерации по каждой точке треугольника, соединяющего прямоугольник на экране, а затем определите, что в пределах диапазона треугольника вызовите программу VS, чтобы вычислить, какой цвет является точкой.
Теперь вы хотите написать треугольный рисунок D3D 12. Вы не можете справиться с ним без тысячи линий, но теперь нам нужны только следующие строки:
# include " RenderHelp.h "
int main ( void )
{
// 初始化渲染器和帧缓存大小
RenderHelp rh ( 800 , 600 );
const int VARYING_COLOR = 0 ; // 定义一个 varying 的 key
// 顶点数据,由 VS 读取,如有多个三角形,可每次更新 vs_input 再绘制
struct { Vec4f pos; Vec4f color; } vs_input[ 3 ] = {
{ { 0.0 , 0.7 , 0.90 , 1 }, { 1 , 0 , 0 , 1 } },
{ { - 0.6 , - 0.2 , 0.01 , 1 }, { 0 , 1 , 0 , 1 } },
{ { + 0.6 , - 0.2 , 0.01 , 1 }, { 0 , 0 , 1 , 1 } },
};
// 顶点着色器,初始化 varying 并返回坐标,
// 参数 index 是渲染器传入的顶点序号,范围 [0, 2] 用于读取顶点数据
rh. SetVertexShader ([&] ( int index , ShaderContext& output) -> Vec4f {
output. varying_vec4f [VARYING_COLOR] = vs_input[ index ]. color ;
return vs_input[ index ]. pos ; // 直接返回坐标
});
// 像素着色器,返回颜色
rh. SetPixelShader ([&] (ShaderContext& input) -> Vec4f {
return input. varying_vec4f [VARYING_COLOR];
});
// 渲染并保存
rh. DrawPrimitive ();
rh. SaveFile ( " output.bmp " );
return 0 ;
}Результаты работы:
| имя файла | иллюстрировать |
|---|---|
| RenderHelp.H | Файл реализации рендеринга, при использовании, включает в себя его достаточно |
| Модель | Загрузка модели |
| Образец_01_triangle.cpp | Пример рисования треугольников |
| Sample_02_Texture.cpp | Как использовать текстуры, как установить матрицу камеры и т. Д. |
| Образец_03_box.cpp | Как нарисовать коробку |
| Sample_04_gouraud.cpp | Простая галада раскраска коробки |
| Образец_05_model.cpp | Как загрузить и нарисовать модель |
| Образец_06_NORMAL.CPP | Увеличить детали модели с помощью нормальной карты |
| Образец_07_specular.cpp | Нарисуйте основные моменты |
Более десяти лет назад я написал учебник по мягкому рендерингу Mini3D, который четко объяснил основные принципы программного оборудования.
Метод реализации этого проекта смоделирован на методе реализации графического процессора. Метод реализации этого проекта имитирует GPU, относительно прост и интуитивно понятный, но расчет очень большой и не подходит для процессора в реальном времени, но он подходит для грубой параллельной обработки графических процессоров.
Существует много учебных пособий для реализации программируемого рендеринга в Интернете, но многие из них имеют проблемы При отборе текстуры преобразование целочисленной координат должно быть округлено, в противном случае положение нескольких вершин текстуры недостаточно стабильно, и будут признаки слегка движущихся; Полем Полем Полем
Есть много очень подробных аспектов реализации рендерера.
Еще один читаемость.
Основной файл RenderHelp.h .
Основные принципы, я объяснил в следующей статье:
При чтении код в основном представляет собой несколько библиотек инструментов, которые можно прочитать из последних 200 строк.
Если вы не понимаете код, вы можете задать вопрос в этом вопросе.