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

2024-02-10 09:44
文章标签 图形学 光栅

本文主要是介绍从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,而我们的数据顺序是RGBcvRst.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到2Dicon-default.png?t=N7T8https://blog.csdn.net/A112459/article/details/136085121?spm=1001.2014.3001.5501

        第二章:三角面片及其填充icon-default.png?t=N7T8https://blog.csdn.net/A112459/article/details/136085127?spm=1001.2014.3001.5501

        第三章:光效果产生立体感icon-default.png?t=N7T8https://blog.csdn.net/A112459/article/details/136085136?spm=1001.2014.3001.5501

        第四章:ZBuffericon-default.png?t=N7T8https://blog.csdn.net/A112459/article/details/136085149?spm=1001.2014.3001.5501

        第五章:旋转矩阵icon-default.png?t=N7T8https://blog.csdn.net/A112459/article/details/136085162?spm=1001.2014.3001.5501

        第六章:纹理贴图icon-default.png?t=N7T8https://blog.csdn.net/A112459/article/details/136085174?spm=1001.2014.3001.5501

        第七章:透视变换实现“近大远小”icon-default.png?t=N7T8https://blog.csdn.net/A112459/article/details/136085189?spm=1001.2014.3001.5501

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

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

这篇关于从0开始图形学(光栅化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/696773

相关文章

GAMES101(5~6节,光栅化)

光栅化Rasterization 透视投影已知field和近平面,如何推导宽度? 根据三角函数:tan field / 2 = (height / 2) / ||n||近平面,从而可以求出高度 因为知道宽高比,所以可以求出宽度,高度 * 宽/高 视口变换 经过MVP变换,顶点位于正则化空间坐标,是一个在 [-1,1] ^3 之间的 x, y, z 坐标构成(标准立方体),我们下一步需要做

图形学之腐蚀膨胀

腐蚀(erode)膨胀(dilate)其实是两种非常形象的操作,但是有的时候容易搞混淆。 腐蚀(erode),是将灰度值小(视觉上就是比较暗)的区域增强扩展,主要用来去除比较亮的噪点。膨胀(dilate),是将灰度值大(视觉上就是比较亮)的区域增强扩展,主要用来连通相似颜色或强度的区域。 然后腐蚀与膨胀涉及的一个重要概念就是核,也可以称之为模板或者掩码。核具有几个重要的属性,形状(圆形、方

图像处理(计算机图形学)和计算机视觉的区别和关系

随着工业互联网的发展,图片处理(计算机图形学)和计算机视觉的应用越来越多,两者有区别也有紧密联系,在此进行简单介绍,共同学习。 图像处理(计算机图形学): 是对输入的图像做某种变换,输出仍然是图像,基本不涉及或者很少涉及图像内容的分析。比较典型的有图像变换,图像增强,图像去噪,图像压缩,图像恢复,二值图像处理等等。基于阈值的图像分割也属于图像处理的范畴。它一般处理的是单幅图像。 计算机视觉:

计算机图形学:中点画圆算法

在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 + y2 = R2。在计算机图形学中,圆和直线一样,也存在在点阵输出设备上显示或输出的问题,因此也需要一套光栅扫描转换算法。为了简化,我们先考虑圆心在原点的圆的生成,对于中心不是原点的圆,可以通过

GAMES101图形学笔记1

一、图形学的应用 1.游戏渲染、光照 2.电影特效 3.面部、动作捕捉,如Avatar(阿凡达)中的面部捕捉 4.设计 建筑设计,汽车设计 5.虚拟现实VR 增强现实AR 6.数码插画 笔刷 PS软件等 7.模拟、仿真 8.GUI 界面设计等 9.字体设计typography 二、为什么学习图形学 1.图形学是一门Awesome的学科,能够创造很多有意思的东西,有意思的图像 2.了解并学习一

计算机图形学入门18:曲面

1.曲面定义         曲面(Surface)在图形学中应用非常广泛,可以用它来描述各种三维物体的表面。如下图所示。 2.贝塞尔曲面 2.1 介绍         曲线和曲面一样都是物体显示的表示方法,自然可以把曲线的概念延伸到平面上。如上图所示,就是贝塞尔曲面(Bezier Surface)构成的表面,并且可以看到是分段面拼接的。         如果对完整的表面进行分解

计算机图形学之图像变换与标定

一.齐次坐标的定义 1.齐次坐标定义 2.齐次坐标的理解 二.最小二乘法 1.最小二乘法 2.最小二乘计算仿射矩阵 三.图像变换 1.关于图像变换的总结 2.旋转矩阵推导 3.刚体变换与仿射变换实现 4.利用SVD求解刚体变换矩阵 5.计算两个点集间的刚体变换 6.奇异值分解的推理 7.3D点云配准之刚体变换 四.标定 1.九点标定 2.opencv九点标定 五.

【计算机图形学】概念:Mobility

基于最近要实现的内容,涉及到了Mobility的概念,但是我不清楚什么是Mobility,网上也搜索不到特别相关的东西,通过问相关方向的师兄,自己看了一篇涉及了一点Mobility Prediction的数据集文章(NeurIPS2022-MultiScan: Scalable RGBD scanning for 3D environments with articulated objects)后

计算机图形学入门08:反走样、滤波与卷积

1.抗锯齿(反走样)         在上一章中,在光栅化三角形的时候出现了明显的锯齿效果。如下图所示是三角形采样过程:         从图上可知像素点不是纯红色就是纯白色。如果在采样前先进行模糊操作(滤波),如下图所示:         经过模糊操作后三角形的边缘颜色变化有了一定的过渡,再进行采样时,靠近三角形边缘的地方可以采到一部分过渡色的像素,采样结果不在是要么红色要么白色,

计算机图形学 -- 变换之旋转二 [鼠标操作]

在上一次的旋转中加入鼠标的动作, 按左键加速,右键减速,中键停止 滚轮的动作文件中好像没有,总之没有找到,只有键的定义 稍后补上 #include<GL/glut.h>#include<stdlib.h>#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") GLfl