[图形图像]C++实现的软件光栅器

第1张:

从坐到右,从上到下。无纹理、无镜面光、无深度缓冲,依次是:

  1. 线框。

  2. 纯色。 即每个三角形一个颜色。

  3. flat着色(相比上次,修正后的效果好多了)。也是每个三角形一个颜色,但是这个颜色是参照了光照情况的。

  4. gouraud着色。根据光照计算每个三角形的顶点颜色,三角形内部根据顶点颜色进行线性插值。

  5. phong着色(这里分辨率太低,看不出和gouraud的区别)。每个像素分别计算光照。

[图形图像]C++实现的软件光栅器

第2张:

分别是flat、gouraud、phong着色,相比第1张,加入了镜面光(注意茶壶的不少地方出现了白色的光斑)。

[图形图像]C++实现的软件光栅器

第3张:

在上一张的基础上引入了纹理。注意壶嘴上的光斑,一个比一个细腻。这一组图仍然没打开深度缓冲,因此显示不太正确。

[图形图像]C++实现的软件光栅器

第4张:

高分辨率的茶壶。软件渲染瓶颈首先是像素处理,因此这么大的茶壶,帧率特别低。

两张分别对应低、高两套设置。

第一个,gouraud着色 + 最近点采样 + 三角形排序(油画家算法)+ 镜面光。帧率123。

第二个,phong着色 + 三线性采样 + 1/z缓冲 + 镜面光。帧率30。

[图形图像]C++实现的软件光栅器

第5张:

平面裁剪。第一个是一个竖着的平面,第一个是一竖一横两个平面。注意裁剪边缘三角形密度较大,因为进行了三角形分割。

[图形图像]C++实现的软件光栅器

第5-2张:

正交投影和平面裁剪。

正交投影,相比普通的透视投影,失去了近大远小的效果。

第二个茶壶,从侧面来观察裁剪平面,证实了这确实是三维空间的裁剪,而非屏幕上的像素裁剪。

[图形图像]C++实现的软件光栅器

第6张:

高分辨率来了!

在屏幕上绘制两个大三角形,展示纹理过滤效果。

从上到下分别是:线框、最近点采样、双线性过滤、三线性过滤、透视纹理修正。

三线性过滤:这里很难看出和双线性的区别,但是在程序中切换状态时是能察觉到变化的。

透视纹理修正:操,屎都给我吓出来了!跟它一比,难怪之前总觉得前面两张怪怪的。这证明了,大纹理三角形不能乱用啊…

[图形图像]C++实现的软件光栅器

第7张:

演示纹理地址寻址方式。

整张图纹理坐标是-2~+2,从上到下,寻址方式依次为箝位、重复、镜像。

[图形图像]C++实现的软件光栅器

第8张:

演示mipmap。

红色是第0层,绿色是第1层,蓝色是第2层,淡蓝色是第三层,等等。

[图形图像]C++实现的软件光栅器

再贴一个骷髅头吧,6万个面,还能有30帧,很好。毕竟我在顶点处理环节非常谨慎的。

gouraud + 镜面光 + 三角形排序(油画家算法,代替z缓冲)。

[图形图像]C++实现的软件光栅器

看了一下水银上的记录,这个项目大概开始10来天了,成品是9000行C++代码,目前效果还是满意的。能够享受成品从视觉上带来的成就感,这是图形相比其他技术的优点。

代码6、7月份分享,执行文件在下面:

http://115.com/file/anwxb9xp#Scan软件光栅.rar

记得看里面的readme.txt。

注意,如果你运行后显示不自然(遮挡关系错误,尤其是骷髅头),尝试按几下4开启深度缓冲,或者按几下5开启油画家算法

Original: https://www.cnblogs.com/cbscan/archive/2012/04/29/2476450.html
Author: Scan.
Title: [图形图像]C++实现的软件光栅器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535092/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C++案例——协助破案

    协助破案。假设已经查清,有 A、B、C、D、E 五个嫌疑人可能参与制造了一起抢劫银行案,但不知道其中哪几个是真正的案犯。不过,有确凿证据表明: 上述论断可以用数理逻辑中的正规表达式…

    C++ 2023年5月29日
    044
  • 聊聊 C++ 中的四种类型转换符

    一:背景 在玩 C 的时候,经常会用 void* 来指向一段内存地址开端,然后再将其强转成尺度更小的 char* 或 int* 来丈量一段内存,参考如下代码: int main()…

    C++ 2023年5月29日
    069
  • C++类中静态数据成员MAP如何初始化

    cpp;gutter:true; conv_xxx.hpp</p> <p>class convolution { …</p> <pre…

    C++ 2023年5月29日
    055
  • c++实践课(上课用)

    源程序: //编写一个程序,将从键盘输入的n个字符串保存在一个一维数组A中。在输入字符串之前,先输入n的值。//要求,数组A需要动态申请空间,程序运行结束前再释放掉。//再输出n字…

    C++ 2023年5月29日
    042
  • 面向对象C++编程与实践考试答案与解析

    一、选择题(每题2分,共2×20=40分) (1) 以下不能对数组 a 进行正确初始化的语句是( C )。A. int a[2][3] = { 0 };B. int a[ ][3]…

    C++ 2023年5月29日
    058
  • C++实现的各种排序算法

    提起排序算法相信大家都不陌生,或许很多人已经把它们记得滚瓜烂熟,甚至随时可以写出来。最近在学习这一块, 索性就把各种内部排序算法总结归纳了一下: 1、 算法分类: 十种常见排序算法…

    C++ 2023年5月29日
    047
  • js c++ 多值返回 返回多个值 c++ tuple

    使用C# 7.0推出的值元组和解构功能。 static (int, int) Calc(int a, int b) { return (a + b, a – b); } stati…

    C++ 2023年5月29日
    063
  • 右值引用与转移语义(C++11)

    参考资料: 左值和右值定义: C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的 左值的定义就是非临时对象(可以取地址,有名字),那些可以在多条语句中使用的对…

    C++ 2023年5月29日
    069
  • (筆記) 如何寫入binary file某個byte的值? (C/C++) (C)

    Abstract通常公司為了保護其智慧財產權,會自己定義檔案格式,其header區會定義每個byte各代表某項資訊,所以常常需要直接對binary檔的某byte直接進行寫入。 In…

    C++ 2023年5月29日
    047
  • vscode c++ 编译生成后,调试时无法命中断点

    1 //test.cpp 2 #include 3 int g_var = 0; 4 void print_line(char *str) 5 { 6 if (str != NUL…

    C++ 2023年5月29日
    065
  • C++源码—lock_guard

    在 C++11 中,我们可以使用 mutex 来实现线程的同步,mutex 包括上锁和解锁两个步骤。 lock_guard 的功能也是实现线程同步,可以进一步偷懒以及避免在锁定期间…

    C++ 2023年5月29日
    035
  • c++反射技术

    https://www.cnblogs.com/lizhanwu/p/4428990.htmlhttps://www.cnblogs.com/leijiangtao/p/12059…

    C++ 2023年5月29日
    063
  • C++中如何精确地输出特定类型的位数

    precision()函数和fixed合用的方法。 其中,fixed表示使用一般的方法(不是科学计数法之类的)输出浮点数。precision是cout自定义的函数,用来设置小数输出…

    C++ 2023年5月29日
    047
  • C++11中的右值引用及move语义编程

    C++0x中加入了右值引用,和move函数。右值引用出现之前我们只能用const引用来关联临时对象(右值)(造孽的VS可以用非const引用关联临时对象,请忽略VS),所以我们不能…

    C++ 2023年5月29日
    061
  • C++ 相关库

    C++ 相关库 说明 RapidJSONhttps://github.com/Tencent/rapidjson Original: https://www.cnblogs.com…

    C++ 2023年5月29日
    062
  • std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(5)

    1 /* 2 * 话题1:使用互斥量保护共享数据 3 * 4 * 接下来学习第五个小话题:避免死锁的进阶指导 5 * 6 * 这一小节的内容,完全引用,只在最后补充上我对这部分的理…

    C++ 2023年5月29日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球