目录
- 环境安装
- 什么是计算机图形学
- 物体上点的坐标变换顺序
- 齐次坐标
- 光栅化
- 如何判定一个点在三角形内
- 光栅化填充三角形示例代码
- 光栅化产生的问题
- 采样不足(欠采样)导致锯齿
- 抗锯齿滤波算法
环境安装
1. C++中安装opencv库
2. C++中安装eigen库
3. C++中安装openGL库 步骤(1)glut下载
4. C++安装openGL库 步骤(2)VS中安装两个NuGet程序包
5. C++安装glew和glfw工具库
要注意的是 glew.h必须包含再glut.h之前
。
如下:
#include <glew.h>
#include <GL/glut.h>
什么是计算机图形学
计算机图形学是利用计算机技术进行图像和视觉内容的创建、处理和显示的领域。它包括2D和3D图形,并利用各种技术、算法和工具来生成、修改和渲染图像。
计算机图形学
可以分为几个子领域:
渲染
:从3D模型生成逼真或风格化图像的过程,考虑到光照、阴影和其他视觉效果。建模
:使用数学或几何技术创建物体或场景的数字表示。这涉及到定义物体的形状、结构和属性
。动画
:通过按顺序排列一系列图像或帧来创建运动的错觉。它涉及到关键帧、插值和骨骼动画
等技术。模拟和虚拟现实
:利用计算机图形学来模拟真实世界的现象或创建沉浸式虚拟环境。这包括物理模拟、车辆或环境的虚拟模拟以及交互式虚拟现实
体验。图像处理
:使用算法对数字图像进行操作和增强,以改善质量、去除噪声、提取信息或应用艺术效果。计算机视觉
:分析和解释视觉数据,提取有意义的信息或理解图像或视频的内容。这包括物体识别、图像分割和运动跟踪等任务。
计算机图形学
在各个行业和领域都有应用,包括娱乐(电影、电子游戏)、设计和可视化(建筑、工业设计)、虚拟现实和增强现实、科学模拟、医学成像和数据可视化。它在创建视觉上吸引人和交互式的数字内容方面起着关键作用。
刘利刚教授:计算机图形学主要包含四大部分的内容:建模(Modeling)、渲染(Rendering)、动画(Animation)和人机交互(Human–computer Interaction, HCI)
物体上点的坐标变换顺序
在计算机图形学中,通常使用一系列变换将物体从模型空间(Model Space)变换到最终的屏幕空间(Screen Space)
。这些变换的顺序可以根据实际需求进行组合。
在给定的坐标变换顺序"M->V->P"中,M代表模型变换(Model Transformation),V代表视图变换(View Transformation),P代表投影变换(Projection Transformation)。下面是每个变换的解释:
模型变换
(Model Transformation)(M):
模型变换将物体从模型空间转换到世界空间
(World Space)。在这个变换中,物体的位置、旋转和缩放发生变化,以便将物体放置在正确的世界位置和大小
。视图变换
(View Transformation)(V):
视图变换将物体从世界空间转换到相机或观察者的空间
,也称为视口空间(View Space)或眼空间(Eye Space)。这个变换决定了观察者的位置和方向,通过这个变换可以实现摄像机的移动和旋转
。投影变换
(Projection Transformation)(P):
投影变换将物体从视口空间转换到裁剪空间
(Clip Space)。在裁剪空间中,物体被投影为二维坐标,并且应用了透视效果。投影变换可以是透视投影或正交投影
,具体取决于所需的效果。
补充 两种投影变换
:
-
正交投影:正交投影是一种
平行投影方式
,它将物体投影到一个平行于
观察平面的平面上。在正交投影中,物体在不同深度上的点被等比例地缩放到二维平面上,没有透视效果。所有平行线在投影后仍然保持平行,长度和角度都得到保持。这种投影方式常用于
需要保持物体尺寸和形状的场景
,如工程图和平面设计。 -
透视投影:
透视投影
是模拟人眼视觉效果
的投影方式,具有近大远小
的效果。在透视投影中,物体在不同深度上的点根据其距离观察者的远近而有所变化。离观察者更远的点在投影中被缩小,离观察者更近的点则被放大。透视投影通过模拟焦点和视角的概念
,使投影更贴近真实的视觉感知。这种投影方式常用于计算机图形学中创建逼真的三维场景
,如游戏、虚拟现实和电影特效。
左图是透视投影效果
右图是正交投影效果
齐次坐标
齐次坐标可以将平移也表示为矩阵的乘法操作。
原因:
齐次坐标是一种扩展的坐标系统,由一组三维坐标(x, y, z)和一个额外的缩放因子(w)组成。在齐次坐标系中,一个点的坐标表示为(x, y, z, w)。
平移可以通过将一个点的坐标与平移矩阵相乘来实现。平移矩阵是一个4x4的矩阵,形式如下:
其中,(tx, ty, tz) 是平移的向量,表示在 x、y、z 方向上的平移距离。
要将一个点的齐次坐标表示转换为三维坐标表示,可以将其除以 w,即:
这样可以得到点在三维坐标系中的位置。
通过使用齐次坐标和平移矩阵
的乘法,可以将平移操作与其他仿射变换(例如旋转、缩放)一起表示为单个矩阵的乘法,从而方便地进行复合变换。
光栅化
光栅化(Rasterization)是计算机图形学中将图形对象转换为屏幕上的像素的过程。
模型都是由一个个三角形组成,光栅化过程,是将三角形离散显示到屏幕的每个像素点。
如何判定一个点在三角形内
方法一:点在三角形三条逆时针边的左侧。具体运算可以使用P0P1xP0Q、P1P2xP1Q、P2P0xP2Q三者的z坐标是否同符号来判断,同符号则在三角形内。
方法二:点的三角形重心坐标是否都大于0,大于0则在三角形内。
光栅化填充三角形示例代码
#include <opencv2/opencv.hpp>
int main() {
// 创建空白图像
int width = 400;
int height = 400;
cv::Mat image(height, width, CV_8UC3, cv::Scalar(0, 0, 0));
// 三角形的三个顶点
cv::Point pt1(100, 100);
cv::Point pt2(300, 100);
cv::Point pt3(200, 300);
// 绘制三角形边界
cv::line(image, pt1, pt2, cv::Scalar(255, 0, 0));
cv::line(image, pt2, pt3, cv::Scalar(255, 0, 0));
cv::line(image, pt3, pt1, cv::Scalar(255, 0, 0));
// 光栅化填充三角形
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
cv::Point point(x, y);
// 使用点在三角形内的判断条件进行填充
if (cv::pointPolygonTest(std::vector<cv::Point>{pt1, pt2, pt3}, point, false) >= 0) {
image.at<cv::Vec3b>(y, x) = cv::Vec3b(0, 0, 255); // 设置像素颜色为红色
}
}
}
// 显示图像
cv::imshow("Rasterization Example", image);
cv::waitKey(0);
return 0;
}
效果图
光栅化产生的问题
锯齿严重,所以后面需要抗锯齿Anti-Aliasing
采样不足(欠采样)导致锯齿
抗锯齿的理解
:
抗锯齿其实并没有让像素面积更细,而是让像素的颜色不是非0即1,而是取中间的某一个值,从而从宏观上看不会锯齿明显。抗锯齿后,边界看上去会更模糊。
原理解释:
采样不足
导致锯齿效应是由于图像或图形的分辨率不足以表示平滑的曲线或边缘所导致的。
在数字图像或计算机图形中,图像是由像素组成的。当图像中的曲线或边缘
没有足够的像素来表示其平滑度
时,就会出现锯齿状的锯齿边缘,也被称为"锯齿效应"或"走样"。
锯齿效应的主要原因是采样率不足。采样率是指在单位长度或单位角度内
所采集的样本或像素数量。当采样率不足时,较光滑的曲线或边缘可能只被几个像素点近似表示,从而导致了锯齿状的边缘。
解决锯齿效应的常见方法之一是增加图像或图形的分辨率
,即增加像素的数量。通过增加像素的数量
,可以更准确地表示曲线或边缘,减少锯齿状的效果。
此外,还有一些抗锯齿技术可以应用,例如抗锯齿滤波算法
,如多重采样抗锯齿(MSAA)、超采样抗锯齿(SSAA)、快速近似抗锯齿(FXAA)、时域抗锯齿(TXAA)等。这些技术通过在渲染过程中对图像进行额外的处理或采样
,来减少或抑制锯齿效应的出现。
本来想采样波形,因为采样不足,导致波形周期远大于原始曲线周期。
抗锯齿滤波算法
- 多重采样抗锯齿(MSAA):多重采样抗锯齿是一种
基础
的抗锯齿技术。它通过在几何图形的边缘上进行多次采样
,然后对采样点进行平均来减少锯齿效应。每个像素点只存储一个颜色样本
和一个深度样本,但在像素覆盖的多个采样点上计算颜色和深度。这种方法能够减少锯齿,并在一定程度上保持边缘的平滑性。
openGL实现MSAA抗锯齿算法代码
:
#include <GL/glut.h>
void init() {
// 设置清屏颜色为黑色
glClearColor(0.0, 0.0, 0.0, 0.0);
// 启用深度测试
glEnable(GL_DEPTH_TEST);
// 启用多重采样抗锯齿
glEnable(GL_MULTISAMPLE);
}
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 在这里进行绘制操作
glutSwapBuffers();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE);
glutInitWindowSize(800, 600);
glutCreateWindow("OpenGL MSAA Example");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
上述示例代码中,通过调用 glEnable(GL_MULTISAMPLE)
启用了多重采样抗锯齿。这将在渲染过程中进行多次采样,并对采样点进行平均
以减少锯齿效应。
-
超采样抗锯齿(SSAA):超采样抗锯齿是通过渲染比实际输出分辨率更高的图像,然后在将其缩小到实际输出分辨率时减少锯齿效应。它通过在较高分辨率的图像上进行采样,然后
使用滤波器对采样结果进行插值
,最终得到抗锯齿效果较好的图像。 -
快速近似抗锯齿(FXAA):快速近似抗锯齿是一种基于像素的抗锯齿算法。它通过检测边缘和锯齿的特征,并在需要的地方应用模糊和混合来减少锯齿效应。FXAA具有较低的计算成本和较好的效果,常用于实时图形渲染中。
-
时域抗锯齿(TXAA):时域抗锯齿是一种结合了多重采样抗锯齿和快速近似抗锯齿的技术。它利用多重采样进行几何边缘的抗锯齿,然后结合时域抗锯齿进行颜色抗锯齿。TXAA通过在时间上对帧进行采样和合成来减少锯齿效应和运动模糊,并提供更平滑的边缘和图像。