图形学-光栅化

1.什么是光栅化

将几何图形绘制到屏幕上的过程叫做光栅化,我们对屏幕的定义如下

  1. 屏幕是像素的数组
  2. 分辨率是屏幕像素数组的尺寸
  3. 屏幕是光栅成像设备。

**光栅化(Rasterization)**指的是将物体绘制到屏幕上。**像素(Pixel)**是具有统一颜色的小方块,是由不同颜色组合而成的(例如 RGB)。

1.1屏幕空间(像素坐标)

在这里插入图片描述
我们认为屏幕左下角为原点,向右为 x 轴,向上为 y 轴。建立平面直角坐标系。屏幕空间满足以下几点

  1. 我们认为像素坐标 (𝑥, 𝑦 ) 为整数坐标;
  2. 像素坐标覆盖范围为 (0, 0) 到 (width − 1, height − 1);
  3. 像素的中心点在 (𝑥 + 0.5, 𝑦 + 0.5);
  4. 整个屏幕的覆盖范围在 (0, 0) − (width, height).

1.2 三角形光栅化

对于一个 3 维图形我们可以用三角形去表示一个一个小面。使用三角形的主要原因是:

  • 三角形是最基本的多边形;
  • 任何多边形都可以拆分成三角形;
  • 空间内任何三个点的连线一定是平面;
  • 三角形有清晰的内部和外部定义;
  • 三角形只要定义顶点的属性就可以计算三角形内部点的渐变关系(三角形的内部插值)。

对于一个三角形,如何映射在像素空间上问题,可以转换成判断一个像素和三角形的位置关系。最简
单的方法就是进行离散化(Sampling)。采样就是连续函数的离散化过程。代码表示如下

for ( int x = 0; x < max ; ++ x)
output [x ]= f(x);

我们对于给定三角形,判断像素中心是否在三角形内部。如果在,那么这个点为 1,否则为 0
在这里插入图片描述
判断代码就可以写为:

for ( int x = 0; x < xmax ; ++ x)
for ( int y = 0; y < ymax ; ++ y)
image [x ][ y] = inside (tri , x +0.5 , y +0.5) ;

对于像素是否在三角形内部的判断,可以使用叉积。具体可以在叉积的讲解部分查看。
对于在边界上的三角形点,可要可不要自己定。为了能够更快速的遍历
像素点,我们可以用以下方法:

  • 使用包围盒(Bounding box),只对三角形最大的包围正方形区进行遍历。但是不适用于窄长的三角形
  • 找到每一行三角形包围住最左和最右边的点进行遍历。我们的结果可能会生成大量的锯齿,此时我们需要一些方式来消除锯齿。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机图形学中,光栅化是将几何图形转换为像素的过程,其中三角形的光栅化是最常见的操作之一。下面是一个简单的C语言算法来实现三角形的光栅化: 1. 首先,我们需要定义一个表示像素的数据结构,可以使用一个二维数组来表示屏幕或画布。 ```c typedef struct { int r, g, b; // 像素的红、绿、蓝分量 } Pixel; // 定义屏幕大小 #define SCREEN_WIDTH 800 #define SCREEN_HEIGHT 600 // 定义屏幕像素数组 Pixel screen[SCREEN_HEIGHT][SCREEN_WIDTH]; ``` 2. 接下来,我们需要定义一个函数来绘制一个三角形。这个函数接受三个顶点的坐标作为参数,并使用扫描线算法来填充三角形内部的像素。 ```c void drawTriangle(int x1, int y1, int x2, int y2, int x3, int y3) { // 扫描线算法 // ... } ``` 3. 在`drawTriangle`函数中,我们需要实现扫描线算法来填充三角形内部的像素。具体步骤如下: a. 首先,找到三角形的最小和最大y坐标,确定需要遍历的扫描线范围。 b. 对于每一条扫描线,计算与三角形的交点。 c. 根据交点的x坐标,确定需要填充的像素范围。 d. 在像素范围内,根据插值计算每个像素的颜色,并将其设置为对应的屏幕像素。 ```c void drawTriangle(int x1, int y1, int x2, int y2, int x3, int y3) { // 找到最小和最大y坐标 int minY = min(y1, min(y2, y3)); int maxY = max(y1, max(y2, y3)); // 遍历每一条扫描线 for (int y = minY; y <= maxY; y++) { // 计算与三角形的交点 // ... // 确定需要填充的像素范围 int startX = min(x1, min(x2, x3)); int endX = max(x1, max(x2, x3)); // 在像素范围内填充颜色 for (int x = startX; x <= endX; x++) { // 根据插值计算每个像素的颜色 // ... // 设置屏幕像素颜色 screen[y][x].r = red; screen[y][x].g = green; screen[y][x].b = blue; } } } ``` 这是一个简单的三角形光栅化算法的C语言实现。你可以根据需要进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值