GAMES101回顾 -- Shading

2023-11-05

Shading

定义:将材质作用于对象的流程

Z-Buffer

  1. 帧缓存(Frame Buffer)
    Frame Buffer是一个用于存储图像像素数据的内存区域。它通常由一个二维数组表示,每个元素对应屏幕上的一个像素。Frame Buffer中的每个像素可以存储颜色信息(如红、绿、蓝三个分量)或其他图像属性。在渲染过程中,图形管线将计算得到的像素颜色值写入Frame Buffer中的相应位置,最终显示在屏幕上。

  2. 深度缓存(Depth Buffer)
    Depth Buffer是一个用于存储每个像素的深度值(或称为Z值)的缓冲区。深度值表示像素在场景中的距离或深度信息。在渲染过程中,深度值可以用于判断像素的可见性和遮挡关系。当多个物体重叠时,深度测试可以根据像素的深度值决定是否更新Frame Buffer中的像素颜色。

  3. 深度测试
    深度测试是通过比较像素的深度值和Depth Buffer中对应位置的深度值进行的。如果像素的深度值比Depth Buffer中的值更小(或更接近相机),则更新Frame Buffer中的像素颜色,并更新Depth Buffer中的深度值。否则,像素被认为是被遮挡的,不进行更新。

Frame Buffer和Depth Buffer在渲染过程中起着重要的作用。它们可以帮助确定像素的可见性、处理遮挡关系,并最终生成最终的图像。深度缓冲技术可以提高渲染效率和真实感,特别是在处理复杂的三维场景时。

着色模型

Lambertian (Diffuse) Shading

  1. 输入参数
  • Viewer direction, v
  • Surface normal, n
  • Light direction, l (for each of many lights)
  • Surface parameters (color, shininess, …)
  1. 光照衰减
    某点光强:I/r^2
    在这里插入图片描述

3.漫反射着色

Ld = kd * (I / r^2) * max(0, n*l) = 漫反射系数 *
在这里插入图片描述

Phong Shading

经典的光照模型,计算每个像素的漫反射、镜面反射和环境光照分量来确定像素的颜色。Phong Shading的计算过程如下:

  1. 计算漫反射分量
    漫反射分量表示了光线在物体表面上的散射程度,与光线入射角度和表面法线的夹角有关,对于每个像素,根据其表面法线和光源的方向。

  2. 计算镜面反射分量
    表示光线在物体表面上的反射程度。镜面反射分量的计算涉及到光线的反射方向、观察者的方向和物体表面的光滑程度。

  3. 添加环境光照分量
    指物体表面接收到的来自周围环境的光线。环境光照分量通常是一个常量或者通过全局光照模型计算得到的。

  4. 将漫反射、镜面反射和环境光照分量相加,得到最终的像素颜色。
    在这里插入图片描述

Blinn-Phong Shading

在Phong Shading的基础上进行了改进。

  • 通过半程向量进行计算
  • 指数p控制高光范围
    镜面反射计算:
    在这里插入图片描述
    整体光照计算(对每个像素做同样的计算):
    在这里插入图片描述

着色频率

  • Flag shading:对面着色
  • Gouraud shading:在三角形的顶点处计算颜色,然后通过插值的方式将这些颜色值在三角形内部进行平滑过渡。每个顶点指定一个颜色值。这些颜色值可以通过光照计算、纹理映射或其他方式得到。接下来,在三角形的内部,通过插值的方式计算每个像素的颜色值。
  • Phong shading:逐像素着色

顶点个数、着色方法、着色频率关系如下图:
在这里插入图片描述

实时渲染管线

  1. 顶点输入(Vertex Input):
  • 从应用程序中获取顶点数据,包括顶点的位置、法线、纹理坐标等信息。
  1. 顶点处理(Vertex Processing):
  • 对每个顶点进行变换操作,将其从模型空间转换到世界空间、相机空间和投影空间。
  • 进行光照计算,计算顶点的颜色或光照强度。
  1. 图元装配(Primitive Assembly):
  • 将顶点组装成图元,如点、线、三角形等。
  1. 光栅化(Rasterization):
  • 将图元转化为屏幕上的像素。
  • 根据图元的形状和位置,在屏幕上生成对应的像素片段。
  1. 片段处理(Fragment Processing):
  • 对每个像素片段进行插值和纹理映射,获取片段的颜色和纹理坐标。
  • 进行光照计算,计算片段的最终颜色。
  1. 像素操作(Pixel Operations):
  • 执行深度测试等操作
  • 最终将像素颜色写入帧缓冲(Frame Buffer)。
  1. 输出合成(Output Merger):
  • 将帧缓冲中的像素数据输出到显示设备,生成最终的图像。

在这里插入图片描述

纹理映射

  • 3D空间对应的2D平面点
    在这里插入图片描述
  • 为每个三角形顶点指定一个纹理坐标(u,v)
    在这里插入图片描述

重心坐标

  • 重心坐标计算
    给定三角形的三点坐标A,B,C,该平面内一点(x,y)可以写成这三点坐标的线性组合形式。α+β+γ=1,则对应(x,y)为重心坐标。
    在这里插入图片描述

  • 应用
    用于插值,根据三个顶点A,B,C的属性插值出点的属性,位置,颜色,深度,法线向量等等;判断点受否在三角形内。

纹理抗锯齿

  • MIPMAP技术
    通过预先生成一系列不同尺寸的纹理贴图,根据物体的距离和尺寸选择合适的MIPMAP级别进行采样,从而减少对原始纹理贴图的采样次数。

纹理的应用

  • 环境光
    在这里插入图片描述

  • 凹凸纹理
    在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GAMES101回顾 -- Shading 的相关文章

  • SpringCloud整体架构解析

    目录 技多不压身 服务治理 负载均衡 消息间调用 服务容错 分布式配置中心和消息推送组件 服务网关 调用链路追踪 消息驱动 防流量卫兵 小结 Spring Cloud的中文名我们就暂且称呼它为 春云 吧 听上去是多么朴实无华的名字 不过呢一
  • 【Xilinx Vivado时序分析/约束系列4】FPGA开发时序分析/约束-实验工程上手实操

    目录 建立工程 添加顶层 模块1 模块2 添加约束文件 编辑时钟约束 打开布线设计 代码代表的含义 时序报告 进行时序分析 Summary 包含了汇总的信息量 Source Clock Path 这部分是表示Tclk1的延时细节 Data
  • 关于mysql中触发器执行动态sql的问题

    这几天手头开发的系统要做一个类似windows账户到期时间的功能 考虑了半天想出了一个技术上和逻辑上都还能实现的解决方案 创建一个用户存入数据库的时候都创建一个事件调度器来控制用户的到期时间 mysql的时间调度器确实很方便 想起来是很简单
  • vue报错:Error: [vuex] Do not mutate vuex store state outside mutation handlers.

    报错原理解读 Error vuex Do not mutate vuex store state outside mutation handlers 该报错从文本意思理解还是很清晰的 不要在mutation函数外修改vuex中存储的值 通常
  • 小程序发布后搜索不到怎么办?

    随着小程序商城的热度不减 更多的电商大佬纷纷使用小程序 如今已建立起2万开发者 1 2亿用户日活的小程序生态 微信对小程序的大力支持 也让无数的开发者和商户看到了微信小程序的无限发展潜力 但是 身边有很多朋友都会遇到一些问题 常见的就是在发

随机推荐

  • CVE-2023-27363 FOXIT PDF READER与EDITOR任意代码执行漏洞复现

    目录 0x01 声明 0x02 简介 0x03 漏洞概述 0x04 影响版本 0x05 环境搭建 文件下载 0x06 漏洞复现 POC下载 利用POC RCE 0x07 修复建议 官方升级 手动升级 0x01 声明 仅供学习参考使用 请勿用
  • ERROR: Failed to parse POMs解决方法

    最近在做jenkins构建项目发布时遇到这个问题 ERROR Failed to parse POMs java io IOException Can t read POM opt gamma jenkins jobs indra pare
  • gitbash使用

    gitbash是什么 git bash是Windows下的命令行工具 基于msys GNU环境 有git分布式版本控制工具 主要用于git版本控制 上传下载项目代码 GNU环境 就是说如果你喜欢linux unix的环境 就可以选择使用gi
  • 如何用Autojs写自己的卡密验证界面?实战代码

    最近有朋友问我的卡密验证界面是怎么写的 今天把源码分享出来 先上一个卡密验证界面的效果图 源码第646行中的main js替换为你的卡密验证通过后要跳转的js文件 这里路径为相对路径 跟本卡密验证 js为同级目录 完整源码 遇到问题 一键加
  • 【转】虚拟机安装Ubuntu的上网设置(有线网络和无线网络)

    虚拟机下ubuntu共享方式上网 一 有线网络 在有线网络的条件下 vmware的安装非常简单 上网方式几乎不用怎么设置 默认NAT模式 如果默认情况下不能上网 则按以下步骤尝试 NAT的DHCP配置 1 将虚拟机的上网方式选为NAT 2
  • down.php无法打开,php下载文件 图片不能打开,该怎么解决

    php下载文件 图片不能打开 function fileDown file name file name iconv utf 8 gb2312 file name file path E php down file name if file
  • STC15单片机实战项目 - PCB设计

    PCB设计 一 设计文件链接 1 PADS9 5格式PCB设计文件 gt Project STC15 V1 0 pcb 2 AltiumDesigner格式PCB设计文件 gt Project STC15 V1 0 PcbDoc 二 获取开
  • 【python爬虫专项(23)】利用Selenium实现网页账号登录(以豆瓣网为例)

    案例网页 https book douban com 1 找到 登陆 注册 的标签 并click 输入对应代码如下 log in browser find element by xpath id db global nav div div
  • Mac os更新系统后安装scrapy报错error: command ‘xcrun‘ failed with exit status 1

    查看报错信息 In file included from src twisted test raiser c 4 In file included from Library Developer CommandLineTools Librar
  • 14 C语言进阶自定义类型详解

    自定义类型 结构体 枚举 联合 大纲 结构体 结构体类型的声明 结构的自引用 结构体变量的定义和初始化 结构体内存对齐 结构体传参 结构体实现位段 位段的填充 可移植性 枚举 枚举的定义 枚举的优点 枚举的使用 联合 联合类型的定义 联合的
  • 敏捷测试的“三板斧“

    什么是三板斧 可灰度 任何变更 都必须是可以灰度的 即控制变更的生效范围 先做小范围变更 验证通过之后才扩大范围 可监控 在灰度的过程中 必须能做到可监控 能了解到变更之后对系统的应用 可回滚 当通过监控发现变更后会引发问题时 还需要有方法
  • 八进制数的表达方法!八进制数在转义符中的使用!

    C C 语言中 如何表达一个八进制数呢 如果这个数是 876 我们可以断定它不是八进制数 因为八进制数中不可能出7以上的阿拉伯数字 但如果这个数是123 是567 或12345670 那么它是八进制数还是10进制数 都有可能 所以 C C
  • Spring学习笔记 搭建环境

    现在开始我们就要开始学习Spring框架了 首先要做的事情就是搭建Spring环境 为了让我们关注于Spring的功能 我在这里使用Spring Initializer 它会自动为我们创建一个包含了Spring依赖的项目 让我们能直接快速开
  • 试题 算法训练 二进制数数

    问题描述 给定L R 统计 L R 区间内的所有数在二进制下包含的 1 的个数之和 如5的二进制为101 包含2个 1 输入格式 第一行包含2个数L R 输出格式 一个数S 表示 L R 区间内的所有数在二进制下包含的 1 的个数之和 样例
  • linux 防火墙打开5432 端口,在ubuntu上打开端口5432

    我试图使用ufw使用sudo ufw allow 5432 tcp在ubuntu上打开端口5432 然后我使用nmap来查看端口5432是否已打开 我得到了这个 root domain sudo nmap sS O 127 0 0 1 St
  • Linux部署kettle并设置定时任务

    一 安装Kettle linux中使用kettle时首先需要jdk环境 这里就不概述linux中jdk的安装与配置了 1 首先将kettle压缩包放入linux并解压 unzip data integration zip kettle安装路
  • C++:理解this指针

    详情见 gt https blog csdn net keneyr article details 111758870
  • STM32 DAC 学习笔记

    本文基于SYM32F4 部分参数说明参考标准库 DAC简介 作用就是把输入的数字编码 转换成对应的模拟电压输出 DAC 可以按 8 位或 12 位模式进行配置 并且可与 DMA 控制器配合使用 在 12 位模式下 数据可以采用左对齐或右对齐
  • ASP.NET MVC Note1

    学习ASP NET MVC第一件事应该就是Route 下面的图摘自的Dino的书 由此粗略的学习可以归结于理解Routing Http Module和Http Handler Route Handler是Route Module的一部分 p
  • GAMES101回顾 -- Shading

    Shading 定义 将材质作用于对象的流程 Z Buffer 帧缓存 Frame Buffer Frame Buffer是一个用于存储图像像素数据的内存区域 它通常由一个二维数组表示 每个元素对应屏幕上的一个像素 Frame Buffer