Если вы не можете использовать OpenGL (или Direct3D), то вам, вероятно, придется написать свой собственный растеризатор. Я также хочу подчеркнуть, что это ужасная идея, и если вы можете использовать OpenGL или Direct3D, вы сэкономите огромную работу, даже если вам действительно трудно заставить эти вещи работать с вашим приложением. Да, вы можете использовать OpenGL или Direct3D для рендеринга в текстуру без создания экранного контекста.
С теоретической точки зрения вы применяете перспективную проекцию (ищите этот термин) к каждой из точек на вашем квадрате. Это каждая точка, не только углы, но и все точки между ними. Люди считают искажение приемлемым, если вы просто применяете преобразование к четырем точкам, обычно, поэтому мы делаем это вместо этого.
Как только ваши 3D-точки преобразуются в 2D-точки с помощью преобразования перспективы, вы рисуете многоугольник, копируя пиксели из вашей текстуры в целевой контекст. Вы захотите пройтись по каждому пикселю в месте назначения и вычислить, какой исходный пиксель заканчивается там. Если он будет вращаться только вокруг оси X, как это показано на рисунке, тогда вам будет намного проще, поскольку каждая строка в месте назначения соответствует строке в источнике. Вольфенштейн использовал тот же трюк (кроме оси Y) для рендеринга перспективы в реальном времени на 286, как и Doom.
Если вы все еще хотите продолжить, но не знаете, что я говорю, найдите одну из тех старых книг, в которой рассказывается, как сделать свой собственный Doom-клон. Эти книги имеют код, который вы ищете. Один или два теперь доступны онлайн, перейдите на эту вики и найдите «Черное искусство программирования 3D-игр» или «Уловки гуру программирования игр Windows». Один или два других могут быть там.