从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

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

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

相关推荐
Padid2 天前
Unity SRP学习笔记(二)
笔记·学习·unity·游戏引擎·图形渲染·着色器
refineiks8 天前
three.js绘制宽度大于1的线,并动态新增顶点
3d·图形渲染·webgl
Winston Wood10 天前
一个简单的例子,说明Matrix类的妙用
android·前端·图像处理·图形渲染
森龙安10 天前
VulkanTutorial(8·Shader modules)
图形渲染
云渲染图科普匠13 天前
3d室内设计效果图渲染平台哪个好?瑞云快图怎么样?
3d·图形渲染·3dsmax
先知demons14 天前
antvG6如何实现节点动画、连线动画、切换节点图标
前端·javascript·vue.js·图形渲染·canva可画
3DCAT实时渲染云14 天前
边缘计算技术的优势与挑战
实时互动·边缘计算·图形渲染
大耳猫17 天前
Android OpenGL天空盒
android·kotlin·android studio·图形渲染
大耳猫19 天前
Android OpenGL触控反馈
android·kotlin·android studio·图形渲染
木市门20 天前
【GAMES101笔记速查——Lecture 16 Ray Tracing4】
图像处理·笔记·图形渲染