当前位置: 首页 > news >正文

从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开始图形学(光栅化)

前言 说起图形学&#xff0c;很多人就会提到OpenGL&#xff0c;但其实两者并不是同一个东西。引入了OpenGL加重了学习的难度和成本&#xff0c;使得一些原理并不直观。可能你知道向量&#xff0c;矩阵&#xff0c;纹理&#xff0c;重心坐标等概念&#xff0c;但就是不知道这些概…...

B站弹幕分析系统

视频展示&#xff0c;请点击。 尚硅谷案例 utllib的基本使用 # 使用urllib来获取百度首页的源码 import urllib.request# (1)定义一个url 就是你要访问的地址 url http://www.baidu.com# (2)模拟浏览器先服务器发送请求 response响应 response urllib.request.urlopen(url)…...

戴上HUAWEI WATCH GT 4,解锁龙年新玩法

春节将至&#xff0c;华为WATCH GT 4作为一款颜值和实力并存的手表&#xff0c;能为节日增添了不少趣味和便利。无论你是钟情于龙年表盘或定制属于自己的表盘&#xff0c;还是过年用来抢红包或远程操控手机拍全家福等等&#xff0c;它都能成为你的“玩伴”。接下来&#xff0c;…...

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之StepperItem组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之StepperItem组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、StepperItem组件 用作Stepper组件的页面子组件。 子组件 无。 接口 St…...

2024-02-08 Unity 编辑器开发之编辑器拓展1 —— 自定义菜单栏与窗口

文章目录 1 特殊文件夹 Editor2 在 Unity 菜单栏中添加自定义页签3 在 Hierarchy 窗口中添加自定义页签4 在 Project 窗口中添加自定义页签5 在菜单栏的 Component 菜单添加脚本6 在 Inspector 为脚本右键添加菜单7 加入快捷键8 小结 1 特殊文件夹 Editor ​ Editor 文件夹是 …...

Intellij IDEA各种调试+开发中常见bug

Intellij IDEA中使用好Debug&#xff0c;主要包括如下内容&#xff1a; 一、Debug开篇 ①、以Debug模式启动服务&#xff0c;左边的一个按钮则是以Run模式启动。在开发中&#xff0c;我一般会直接启动Debug模式&#xff0c;方便随时调试代码。 ②、断点&#xff1a;在左边行…...

文件上传-Webshell

Webshell简介 webshell就是以aspphpjsp或者cgi等网页文件形式存在的一种命令执行环境&#xff0c;也可以将其称做为一种网页木马后门。 攻击者可通过这种网页后门获得网站服务器操作权限&#xff0c;控制网站服务器以进行上传下载文件、查看数据库、执行命令等… 什么是木马 …...

掌握虚拟化与网络配置之道:深入浅出VMware及远程管理技巧

目录 虚拟机介绍 虚拟机的关键字 服务器架构的发展 为什么用虚拟机VMware 虚拟机和阿里云的区别 功能角度 价格因素 应用场景 优势方面 找到windows的服务管理 配置VMware 关于VMware安装的几个服务 vmware如何修改各种网络配置 关于NAT的详细信息(了解) NAT(网…...

【漏洞复现】狮子鱼CMS某SQL注入漏洞

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…...

Python学习之路-Tornado基础:安全应用

Python学习之路-Tornado基础:安全应用 Cookie 对于RequestHandler&#xff0c;除了在初始Tornado中讲到的之外&#xff0c;还提供了操作cookie的方法。 设置 set_cookie(name, value, domainNone, expiresNone, path‘/’, expires_daysNone) 参数说明&#xff1a; 参数名…...

6.0 Zookeeper session 基本原理详解教程

客户端与服务端之间的连接是基于 TCP 长连接&#xff0c;client 端连接 server 端默认的 2181 端口&#xff0c;也就 是 session 会话。 从第一次连接建立开始&#xff0c;客户端开始会话的生命周期&#xff0c;客户端向服务端的ping包请求&#xff0c;每个会话都可以设置一个…...

生成式人工智能攻击的一年:2024

趋势科技最近公布了其关于预期最危险威胁的年度研究数据。生成人工智能的广泛可用性和质量将是网络钓鱼攻击和策略发生巨大变化的主要原因。 趋势科技宣布推出“关键可扩展性”&#xff0c;这是著名年度研究的新版本&#xff0c;该研究分析了安全形势并提出了全年将肆虐的网络…...

K8S之Namespace的介绍和使用

Namespace的理论和实操 Namespace理论说明Namespace实操创建、查看命名空间使用ResouceQuota 对Namespace做资源限额更多ResouceQuota 的使用 Namespace理论说明 命名空间定义 K8s支持多个虚拟集群&#xff0c;它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间&…...

封装sku组件

1. 准备模板渲染规格数据 使用Vite快速创建一个Vue项目&#xff0c;在项目中添加请求插件axios&#xff0c;然后新增一个SKU组件&#xff0c;在根组件中把它渲染出来&#xff0c;下面是规格内容的基础模板 <script setup> import { onMounted, ref } from vue import axi…...

Unity笔记:相机移动

基础知识 鼠标输入 在Unity中&#xff0c;开发者在“Edit” > “Project Settings” > “Input Manager”中设置输入&#xff0c;如下图所示&#xff1a; 在设置了Mouse X后&#xff0c;Input.GetAxis("Mouse X")返回的是鼠标在X轴上的增量值。这意味着它会…...

Java项目管理01-Maven基础

一、Maven的常用命令和生命周期 1.Maven的常用命令使用方式 complie&#xff1a;编译&#xff0c;将java文件编译为class字节码文件 clean&#xff1a;清理&#xff0c;删除字节码文件 test&#xff1a;测试&#xff0c;运行项目中的test类 package&#xff1a;打包&#x…...

计算机网络(第六版)复习提纲30

B HTTP 名词解释&#xff1a;协议HTTP定义了浏览器怎样向万维网服务器请求万维网文档&#xff0c;以及服务器怎样把文档传给浏览器。从层次的角度看&#xff0c;HTTP是面向事务的应用层协议&#xff0c;它是万维网上可靠地交换文件的重要基础&#xff0c;不仅能够传送完成超文本…...

基于SSM的图书管理系统

点击以下链接获取资源&#xff1a; https://download.csdn.net/download/qq_64505944/88820548?spm1001.2014.3001.5503 Java项目-6 librarySystem 开发完毕 万一你要作为课程设计或者毕设&#xff0c;不太会配&#xff0c;可以到下面我博客中私信&#xff0c;我帮你远程部…...

【GAMES101】Lecture 19 相机

目录 相机 视场 Field of View (FOV) 曝光&#xff08;Exposure&#xff09; 感光度&#xff08;ISO&#xff09; 光圈 快门 相机 成像可以通过我们之前学过的光栅化成像和光线追踪成像来渲染合成&#xff0c;也可以用相机拍摄成像 今天就来学习一下相机是如何成像的…...

《走进科学》灵异事件:Nginx配置改了之后一直报错

想要安装WoWSimpleRegistration&#xff0c;就定下来要用nginxphp8 &#xff0c;结果nginx那里加上php的支持之后一直报错&#xff1a; $ sudo service nginx restart Job for nginx.service failed because the control process exited with error code. See "systemctl…...

基于LSTM时间序列预测思想优化百川2-13B的对话连贯性

基于LSTM时间序列预测思想优化百川2-13B的对话连贯性 你有没有遇到过这种情况&#xff1f;和一个大模型聊得正起劲&#xff0c;聊了十几轮甚至几十轮之后&#xff0c;你突然发现&#xff0c;它好像“失忆”了。你之前明明告诉过它你的名字、你的职业&#xff0c;甚至你们刚刚讨…...

springboot-vue+nodejs的公考在线刷题学习平台的设计与实现

目录技术栈选择核心模块设计关键实现步骤扩展功能建议示例代码片段&#xff08;Spring Boot Controller&#xff09;注意事项项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作技术栈选择 后端框架&#xff1a;Spring Boot&#…...

SlopeCraft:解锁Minecraft地图艺术创作的神器

SlopeCraft&#xff1a;解锁Minecraft地图艺术创作的神器 【免费下载链接】SlopeCraft Map Pixel Art Generator for Minecraft 项目地址: https://gitcode.com/gh_mirrors/sl/SlopeCraft 副标题&#xff1a;面向创意玩家的方块世界艺术生成工具&#xff0c;让照片秒变立…...

如何用FDS火灾动力学模拟器预知建筑火灾的致命威胁?5个关键步骤让你成为安全专家

如何用FDS火灾动力学模拟器预知建筑火灾的致命威胁&#xff1f;5个关键步骤让你成为安全专家 【免费下载链接】fds Fire Dynamics Simulator 项目地址: https://gitcode.com/gh_mirrors/fd/fds 想象一下&#xff0c;当火灾发生时&#xff0c;你能提前知道烟雾会如何扩散…...

Eino:Agent的LLM抽象

拨开迷雾看本质&#xff1a;从零推导 ChatModelAgent&#xff08;模型适配层与 Agent 运行时&#xff09; 在 react.md 里看到的是 “ReAct 作为范式” 的推导&#xff1b;而本篇把视角切到 chatmodel.go 作为工程实现&#xff1a;它不只是“为了 ReAct 画图”&#xff0c;更是…...

Blender Python API实战:AI辅助3D建模自动化脚本开发

1. 为什么需要AI辅助Blender脚本开发 第一次打开Blender时&#xff0c;相信很多人都会被它复杂的界面吓到。密密麻麻的菜单栏、数不清的快捷键、各种专业术语...作为一个从Maya转战Blender的老3D设计师&#xff0c;我完全理解这种挫败感。但后来发现&#xff0c;Blender最强大的…...

痕迹的痕迹:从朱君鸿论牟宗三与林安梧看学术争论的自感根源

痕迹的痕迹&#xff1a;从朱君鸿论牟宗三与林安梧看学术争论的自感根源 岐金兰 --- 摘要 朱君鸿的文章《从“横摄系统”到“横摄归纵”》是对牟宗三与林安梧不同朱子观的比较研究。从AI元人文的视角看&#xff0c;这篇文章本身是一层“痕迹”——它是对牟宗三、林安梧痕迹的再痕…...

告别音乐标签混乱难题:Music Tag Web的智能高效解决方案

告别音乐标签混乱难题&#xff1a;Music Tag Web的智能高效解决方案 【免费下载链接】music-tag-web 音乐标签编辑器&#xff0c;可编辑本地音乐文件的元数据&#xff08;Editable local music file metadata.&#xff09; 项目地址: https://gitcode.com/gh_mirrors/mu/musi…...

5个行业颠覆场景:用PptxGenJS实现办公自动化效率革命

5个行业颠覆场景&#xff1a;用PptxGenJS实现办公自动化效率革命 【免费下载链接】PptxGenJS Create PowerPoint presentations with a powerful, concise JavaScript API. 项目地址: https://gitcode.com/gh_mirrors/pp/PptxGenJS PptxGenJS是一款基于JavaScript的开源…...

BERT 模型:自然语言处理的新篇章

BERT模型&#xff1a;自然语言处理的新篇章 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是研究的热点之一。2018年&#xff0c;谷歌推出的BERT模型彻底改变了NLP的发展方向&#xff0c;成为该领域的重要里程碑。BERT&#xff08;Bidirectional En…...