从0开始图形学(光栅化)

前言

说起图形学,很多人就会提到OpenGL,但其实两者并不是同一个东西。引入了OpenGL加重了学习的难度和成本,使得一些原理并不直观。可能你知道向量,矩阵,纹理,重心坐标等概念,但就是不知道这些概念在图形学中具体是怎么使用的。

本文不使用OpenGL,只用C代码实现光栅化过程,并配合OpenCV来显示渲染结果。让图形学的相关过程和原理变的直观和纯粹,本文结束后,我们将能够把一个3D模型文件只通过C语言渲染出来,如下结果。

环境准备

工欲善其事必先利其器。学习之前首先需要安装开发环境,以Windows为例(Mac使用XCode,配置方法可以网上搜索),开发工具首选Visual Studio。然后需要安装OpenCV环境,OpenCV在此只用来显示渲染结果,同时用到诸如画线和画点的简单功能,它不是必要的。参照Windows中安装OpenCV开发环境-CSDN博客

完成开发环境搭建后,创建一个控制台项目,打开main函数所在的cpp文件,输入以下代码

复制代码
// CGFromZero.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

const int gRstImgWid = 1000, gRstImgHei = 600;      // 结果图的长宽大小
unsigned char _rstImage[gRstImgHei][gRstImgWid][3]; // 结果图
const char _backColor[3] = {50, 100, 150};          // 结果图的背景颜色

void ShowCGRst()
{
    cv::Mat cvRst = cv::Mat(gRstImgHei, gRstImgWid, CV_8UC3);

    for (size_t y = 0; y < gRstImgHei; ++y)
    {
        for (size_t x = 0; x < gRstImgWid; ++x)
        {
            cvRst.data[y * cvRst.step + x * cvRst.channels() + 0] = _rstImage[y][x][2];     // 这里没有错,OpenCV中的数据存储顺序是BGR,而我们的数据顺序是RGB
            cvRst.data[y * cvRst.step + x * cvRst.channels() + 1] = _rstImage[y][x][1];
            cvRst.data[y * cvRst.step + x * cvRst.channels() + 2] = _rstImage[y][x][0];
        }
    }

    cv::imshow("愚 匠", cvRst);
    cv::imwrite("./Chapter0.png", cvRst);
    cv::waitKey(-1);
}

void CGRender()
{
}

int main()
{
    // 先将结果图画上背景色
    for (size_t y = 0; y < gRstImgHei; ++y)
    {
        for (size_t x = 0; x < gRstImgWid; ++x)
        {
            _rstImage[y][x][0] = _backColor[0];
            _rstImage[y][x][1] = _backColor[1];
            _rstImage[y][x][2] = _backColor[2];
        }
    }

    // 渲染
    CGRender();
    //
    // 显示渲染结果
    ShowCGRst();
}

编译,运行,如果出现以下的图像,就说明环境准备就绪,我们后续的学习将 上述代码的基础上实现

内容构成

该笔记分成下列几个章节进行阐述,由浅入深的介绍渲染的过程,并在其中穿插相关的知识点,该笔记侧重于实战,对于基础原理强调其具体的使用方式,尤其是数学知识,不涉及相关的基础推导。

第一章:从3D到2Dhttps://blog.csdn.net/A112459/article/details/136085121?spm=1001.2014.3001.5501

第二章:三角面片及其填充https://blog.csdn.net/A112459/article/details/136085127?spm=1001.2014.3001.5501

第三章:光效果产生立体感https://blog.csdn.net/A112459/article/details/136085136?spm=1001.2014.3001.5501

第四章:ZBufferhttps://blog.csdn.net/A112459/article/details/136085149?spm=1001.2014.3001.5501

第五章:旋转矩阵https://blog.csdn.net/A112459/article/details/136085162?spm=1001.2014.3001.5501

第六章:纹理贴图https://blog.csdn.net/A112459/article/details/136085174?spm=1001.2014.3001.5501

第七章:透视变换实现"近大远小"https://blog.csdn.net/A112459/article/details/136085189?spm=1001.2014.3001.5501

第八章:阴影(待写......)

第九章:鼠标键盘交互(待写......)

相关推荐
17岁的勇气4 天前
Unity Shader unity文档学习笔记(十九):粘土效果,任意网格转化成一个球(顶点动画,曲面着色器)
笔记·学习·unity·图形渲染·顶点着色器·曲面着色器
郝学胜-神的一滴7 天前
Horse3D引擎研发笔记(四):在QtOpenGL下仿three.js,封装EBO绘制四边形
c++·3d·unity·游戏引擎·godot·图形渲染·虚幻
郝学胜-神的一滴8 天前
Horse3D引擎研发笔记(一):从使用Qt的OpenGL库绘制三角形开始
c++·qt·3d·unity·图形渲染·unreal engine
爱思德学术9 天前
中国计算机学会(CCF)推荐学术会议-A(计算机图形学与多媒体):VR 2026
计算机视觉·图形渲染·虚拟现实·用户界面
郝学胜-神的一滴13 天前
OpenGL状态机与对象管理:优化图形渲染的高效方法
开发语言·c++·程序人生·算法·图形渲染
张人大 Renda Zhang13 天前
如何用分布式架构视角理解宇宙稳定性?从精细调参到微服务的类比思考
前端·分布式·微服务·架构·图形渲染
郝学胜-神的一滴15 天前
能表示旋转的矩阵是一个流形吗?
线性代数·矩阵·图形渲染
赤水无泪17 天前
A 常见图形API和图形渲染引擎介绍
图形渲染
山楂树の18 天前
模型优化——在MacOS 上使用 Python 脚本批量大幅度精简 GLB 模型(通过 Blender 处理)
python·macos·3d·图形渲染·blender
D5Render20 天前
D5渲染器 2.11 上线丨AI 设计助手、AI PBR 材质生成与推荐、自定义路径、高级笔刷、完整支持平行投影
aigc·图形渲染·3d渲染·渲染器