Вы можете написать библиотеку, которая выполняет вызовы непосредственно к графическим драйверам, или вы можете написать собственный конвейер, работающий на процессоре, который будет функционально эмулятором для выделенного графического оборудования, но это будет сложный, ненадежный, медленныйи, вероятно, будет стоить вам много времени для внедрения при очень небольшом окупаемости инвестиций.
Как уже упоминалось в комментариях, графические процессоры работают так, как они делают, потому что они были разработаны на аппаратном уровне для выполнения. это так. API OpenGL / DirectX / Vulkan просто позволяют вам больше или меньше контролировать этот конвейер и подключать пользовательские этапы шейдера.
Причина, по которой вы не можете написать свой собственный растеризатор, заключается в том, что это этапв конвейере, в котором это в значительной степени настолько эффективно, насколько это возможно. Ваша версия вряд ли будет лучше.
Не слишком заботьтесь о непрограммируемых частях конвейера. Это компетенция аппаратных инженеров и программистов драйверов.
Если вы хотите много контролировать существующее оборудование, попробуйте DX12 или Vulkan / Metal. Они настолько близки, насколько это возможно для программиста, без написания пользовательских драйверов.