太极图形学——渲染——光线追踪概念部分

2024-05-28 17:12

本文主要是介绍太极图形学——渲染——光线追踪概念部分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序动画和渲染

程序动画和渲染有一些类似的地方,都是找到合适的像素并填上颜色,但是要把一个图片渲染的好看是有一些规则来指导的

光线追踪包含哪些呢

果壳中的光线追踪器

实时条件下的光线追踪:需要进行光栅化的处理

离线条件下做cg的话:通过光线追踪实现,现在已经有了实时的光追效果(比较吃内存)

如果不考虑实时性的化,光追的效果会更好,同时概念也更加便于理解

人是怎么看世界的

虚拟世界的渲染也是类似的,设置一个虚拟的光源,打出光反射到相机(眼睛)

在相机前设置一块幕布。从幕布上获取信息,也就是不同的像素填充不同的颜色

光线是射线,有起点,有方向,当这个方向指向我们的眼睛,或者说摄像头的时候,我么可以获取光线所附带的信息,当我们在做假设的时候,认为光线是走直线的,并且光和光之间没有碰撞和交互,且最重要的是,假设光线是可逆的,可以通过光线找到光源,为什么可逆最重要,因为我们可以通过眼睛(摄像机)射出去的光线找到光源,并让其提供信息

光线追踪本质上是通过追踪光线了解到颜色,这条光线看到了什么颜色

打出光线,查看物体本身的颜色

这样做会丢失很多的信息

人眼所看到的是一个亮度和颜色的叠加,事实上,这两个方块的颜色是一样的,但是亮度不一样,因此着色有两个部分:一个是颜色,一个是亮度

亮度是怎么来的,怎么算的,光线和物体法向的夹角的cos值与亮度呈正比

解释是这样的,本身光源打出来有一个面积,当打在物体上后,这个面积变大了,面积越大,能量的密度就越低,自然也就变暗了

如果按照这个方式,我们给每一个颜色乘上一和光源连线的夹角的cos值

现在缺的是什么,缺少了高光,高光要怎么解释,

亮度不仅仅和光线本身在物体上的能量有关,同时还应该和视线的夹角有关,这个光线打在物体上后反射出来的光和我的视线有一个夹角,若是这个夹角越小,那么物体就应该越亮

同时,也可以用角平分线和法线之间的夹角来简化计算

最后一个模型的颜色是怎么组成的,如下图

加上高光后图片变的更加真实了

接下来,很容易想到的是添加阴影,第一个ray tracer,1979年,这个现在跑的话,以现在的硬件性能,实时性完全可以保证

这个怎么解决阴影,判断有无阴影遮挡即可

这样图形就拥有了阴影了

如果有镜面反射,应该怎么解决,我们的目的是追踪从眼睛出发的光线。看他看到了什么颜色,如果是镜面反射,那么又会射出去一条新的光线,我们可以问这条新的光线发现了什么,我们将其做一个插值,就是一个递归的过程

如果是一个半透明的物体呢,那就打两段光线就可以了

这样就可将图片渲染成这样了

到这一步,就是传统的光线追踪,而且有很多的东西需要调参,最后的效果还是有一些差距

现在的光线追踪,就是path tarcer,应该怎么做呢

问题1.漫反射,传统的光线追踪将漫反射作为光线的终点

例如全局关照,没开的时候漫反射的表面光线就不会弹出去了

反射的光线是比较随机的

可以从统计学的角度来解决这个问题

这种方法叫做蒙特卡洛法,用随机的方式去估算一个物理量

这样做的问题是不可接受的慢

可以设置为N=1.但这样做噪声特别大

解决方法是提高采样率就可以了,就是提高从眼睛射出去的光的数量,然后再求平均

可以得到这样一个效果

还有一个问题,光线的退出机制比较模糊

可以设计一个光线退出时的深度,给光线设置一个最大的反射次数

看看对比图

除了这个办法,我们还可以使用另一种解决方法,这种方法是使用俄罗斯轮盘赌

这个方法的逻辑是,我们依然询问每一条光线看到了什么,但是在问之前,我们预设一个阈值,再0到1之间,若是随机一个0到1的值在阈值之上,那么直接跳出递归

将代码结合起来就是下图这种

核心思想有三点:

使用这个的话,我们还是会设置一个最大的深度

最后就形成了一个比较好的渲染效果

总结:一般第一行通过光栅化的方式来实现

第二部分则是使用光线追踪

进一步了解:辐射度量学

这篇关于太极图形学——渲染——光线追踪概念部分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011182

相关文章

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

计算机网络基础概念 交换机、路由器、网关、TBOX

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、VLAN是什么?二 、交换机三、路由器四、网关五、TBOXTelematics BOX,简称车载T-BOX,车联网系统包含四部分,主机、车载T-BOX、手机APP及后台系统。主机主要用于车内的影音娱乐,以及车辆信息显示;车载T-BOX主要用于和后台系统/手机APP通信,实现手机APP的车辆信息显示与控

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4

项目实战系列三: 家居购项目 第四部分

购物车 🌳购物车🍆显示购物车🍆更改商品数量🍆清空购物车&&删除商品 🌳生成订单 🌳购物车 需求分析 1.会员登陆后, 可以添加家居到购物车 2.完成购物车的设计和实现 3.每添加一个家居,购物车的数量+1, 并显示 程序框架图 1.新建src/com/zzw/furns/entity/CartItem.java, CartItem-家居项模型 /***