美文网首页
软件光栅化(确定3d三角形的三个顶点的坐标位置。)

软件光栅化(确定3d三角形的三个顶点的坐标位置。)

作者: 草帽星 | 来源:发表于2019-03-23 17:57 被阅读0次
光栅化全过程

计算三个点的坐标,那么熟悉模型的朋友应该知道要有两个数据,一个是顶点坐标数据,一个是顶点索引数据,在dx11和opengl中,都会把这两个数据缓存在硬件缓存区中,软件光栅化,我们拿到这两个数据,取出一个三角形的三个点的坐标,通过mvp变换就可以完成坐标得一部分转换,但是还有一部分是什么呢?如上图,乘上mvp矩阵后,也就相当于完成了投影变换,仅此而已,下边的步骤一般是硬件为我们完成的,但是软件光栅化不借助任何gpu,就cpu,那就开始一步步算嘛,从裁剪坐标系开始吧

为什么要裁剪坐标系,因为在截头体内部,有时候模型在截头体内部放不下,超出部分需要被剪裁,这个,过程网上说的各种复杂,简单用代码来说就是

//检查齐次坐标同 cvv 的边界用于视锥裁剪

int transform_check_cvv(const vector_t*v) {

    float    w = v->w;

    int    check =0;

    if(v->z<0.0f) check |=1;

    if(v->z>  w) check |=2;

    if(v->x< -w) check |=4;

    if(v->x>  w) check |=8;

    if(v->y< -w) check |=16;

    if(v->y>  w) check |=32;

return    check;

}

在上述代码中可见,其实就是很简单做了一下判断是否在截头体内部,一个三角形可能完全在截头体内部,也可能完全在截头体外部,也可能部分在截头体内部,完全在内部的不用管嘛,但是完全在外边的需要剔除,部分在截头体外部的,需要舍去在外部的部分,重新把在内部的部分进行分割成两个三角形再次进行处理。

PS:当然上边代码只是简单判断下一个点是否在三角形内部啦,代码来自韦易笑大神

好了裁剪完了,就开始下一步进行透视除法喽,就是把一个点的(x, y, z, w)都除以w变成(x/w, y/w, z/w, 1)变成ndc中的坐标,

简单来说就是照着做就完事了,复杂来说,去看龙书有具体为什么这么做。。。(当然我写这个只是为了初学者脑子里有个大体步骤思路,不深究,容易带丢了给)

下边是视口变换原理推导,简单来说就是ndc变换到屏幕上的坐标

其中

ndc的坐标范围是

而viewport的坐标范围是

注:由上图知,视口的起点为(X, Y),宽高分别为Width和Height,x轴向右为正,y轴向下为正,y轴的方向与三维坐标正好相反。视口是一个2D平面,但是在viewport变换中,Z坐标也是跟着变换的,只是在这个图中没有体现。

先求变换矩阵的第一列

ndc中的左上角点(-1, 1, 0, 1)映射到viewport中的起点(X, Y, MinZ, 1),

ndc中的右上角点(1, 1, 0, 1)映射到viewport中的点(X+Width, Y, MinZ, 1),

假设变换矩阵的第一列为[x’, y’, z’, 1]T据矩阵乘法有

[-1, 1, 0, 1]* [x’, y’, z’, 1]T = X

[1, 1, 0, 1]* [x’, y’, z’, 1]T = X+Width

对应的两个方程为

-1*x’ + 1*y’ + 0*z’ + 1*w’ = X

1*x’ + 1*y’ + 0*z’ + 1*w’ = X+Width

解之得

x’ = Width/2

y’ = 0

z’ = 0

w’ = x + Width/2

再求第二列

列方程(这里省略了x’,z’,但结果不变,下同)

y’ + 1*w’=Y

-1*y’ + 1*w’=Y+Height

解之得

y’ = -Height/2

w’ = Y + Height/2

最后求第三列

列方程

0*z’ + 1*w’ = MinZ

1*z’ + 1*w’ = MaxZ

解之得

z’ = MaxZ – MinZ

w’ = MinZ

组合以上各列,得到视口变换矩阵

然后 嘿嘿嘿,坐标算出来了!!!!

相关文章

  • 软件光栅化(确定3d三角形的三个顶点的坐标位置。)

    计算三个点的坐标,那么熟悉模型的朋友应该知道要有两个数据,一个是顶点坐标数据,一个是顶点索引数据,在dx11和op...

  • Shader笔记——3D数学基础

    1.0 坐标与坐标系 1.1 坐标及坐标系的概念 在3D世界中,为了确定不同顶点所在的位置,需要使用坐标表示,二坐...

  • OpenGL(一) OpenGL入门

    1.概念 2D+透视 = 3D 3D术语: 光栅化:实际绘制或填充每个顶点之间的像素形成过程 着色:沿着顶点之间改...

  • OpenGL ES GLSL简介

    1、着色器渲染过程 tips: 顶点着色器:只完成了顶点的计算,然后交给下一步进行图元装配和光栅化 光栅化:确定图...

  • OpenGL 入门

    走向3D 2D + 透视 = 3D 3D术语 (入门级) 光栅化:实际绘制或填充每个顶点之间像素的形成线程 着色:...

  • OpenGL的认识

    3D的术语 光栅化:实际绘制或填充每个顶点之间的像素形成的线程 着色:沿着顶点之间改变颜色值,能够轻松创建光照照射...

  • Android OpenGL 01 --- 基本概念

    一.为什么是三角形? 三角形是图像领域的最小单元。 二. OpenGL绘制过程 1.位置排版,顶点位置确定好(顶点...

  • OpenGL常用概念梳理

    3D术语 光栅化:实际绘制或填充每个顶点之间的像素形成线程 着色:沿着顶点之间改变颜色值,能轻松创建光照照射到一个...

  • 光栅化阶段:三角形设置、三角形遍历、像素着色、合并

    光栅化阶段 光栅化阶段分了四个步骤:三角形设置、三角形遍历、像素着色、合并。 三角形设置: 光栅化的第一个流水线阶...

  • 软件光栅化入门

    光栅化本质说白了就是填充一个三角形而已,各类3D模型的图元(基础组成3d模型的最小单位)为三角形,三角形填充完毕,...

网友评论

      本文标题:软件光栅化(确定3d三角形的三个顶点的坐标位置。)

      本文链接:https://www.haomeiwen.com/subject/ypqhvqtx.html