games101笔记 Shading

2023-10-30

什么是shading

  • 不同的物体应用不同的材质的过程
  • 就是计算出物体具体应该在的地方,物体的光照,物体本身应该有的材质。

Blinn-Phong Reflectance Model(Blinn-Phong反射模型)

Blinn-Phong Reflectance Model是一个简化模型

shading point

图片

Shading is Local

  • shading是局部的,在shading不考虑其他的物体存在,就考虑当前像素点本身,也就不生成阴影

Diffuse Reflection(漫反射)

漫反射结果和观测方向无关

Lambertian (Diffuse) Shading

图片

Specular Term (Blinn-Phong)(镜面反射(高光))

图片

图片

Ambient Term(环境光)

Blinn-Phong中将环境光看成一个常量

图片

Blinn-Phong Reflection Model的一个生成过程

图片

Shading Frequencies(着色频率)

不同的着色频率的差异

图片

Flat shading(平面着色)

根据每个三角形的法线计算着色效果。着色计算只执行一次,整个三角形都采用计算结果的颜色。

图片

Gouraud shading

针对每个顶点计算,而后对每个顶点的结果颜色进行线性插值得到片元的颜色

图片

Phong shading

在每一个像素上都进行一次着色

和发明Blinn-Phong Reflection Model的人是一个人

图片

图片

Graphics (Real-time Rendering) Pipeline(实时渲染管线)

图片

Shader Programs

现代的GPU允许用户通过编程来解决顶点和像素如何做着色,这就需要用户来自己写Shader,Shader本质上就是一个能在硬件上执行的程序。

http://shadertoy.com/view/ld3Gz2

Texture Mapping(纹理映射)

纹理映射技术,是一种将图形绘制(映射)到表面的技术

确定每一个三角形的顶点在texture上的位置图片![图片](https://img-blog.csdnimg.cn/img_convert/7ffe3945d49eeda26ead8390b3f08e25.png

Barycentric Coordinates(重心坐标)

重心坐标推导

重心坐标计算

图片

重心坐标的缺陷

重心坐标并不是永久不变的,在经过投影后,重心坐标可能会发生改变。因为在投影之后,原来的三角形会发生变形,点的相对位置就会发生改变,投影之后计算出的重心坐标和投影前的重心坐标就并不相同。

所以要插值一些三维空间的属性时,要先在三维空间中算出重心坐标,然后再用在三维空间中算出重心坐标进行插值,而不能使用投影之后的坐标进行插值。

因为要考虑的深度的因素。三角形投影到屏幕上,覆盖很多像素,像素都有中心,可以判断出像素的中心在投影到屏幕上的三角形的某一位置上,在投影的三角形里对三个顶点的深度做插值,这种算法是不对的,因为三角形在投影到屏幕的过程中会经过一个深度测试的过程,其中深度值较大的顶点会被丢弃,所以如果用投影后的三角形的重心坐标计算插值,可能就会少某些顶点或者说对应的顶点的属性发生改变(因为没有通过深度测试的顶点被丢弃了,在这个位置上时其他不同属性的顶点)。而正确的做法是找到这个这个像素对应的三维空间中的三角形,在三维空间中将深度插值好,然后再放回来。

原文出处

Applying Textures

图片

Texture Magnification

当纹理过小时

低分辨率纹理放大到高分辨率时

图片

Bilinear Interpolation

求2次线性插值,所以叫双线性插值

图片

图片

当纹理过大时

会出现的情况

图片

为什么会有这个问题

近处一个像素覆盖的纹理区域相对较小,在远处一个像素则覆盖了一片纹理。屏幕上的像素覆盖的纹理大小是各不相同的。如果是近处,用像素中心去纹理上进行取样,在一小块纹理上,采样中心的对应的纹理做一小片纹理区域的平均值问题不大;但是当远处用像素的纹理中心进行采样时,采样中心对应的纹理做一个很大块纹理区域的平均值就有问题

解决方案(超采样)

但是超采样的花费太大

图片

Mipmap

图片

左图为屏幕上的像素点,右图为纹理空间。可以看到,左图的一个红点到上下两个红点都是一个像素,将这三个红点映射到纹理空间时,我们要求左图左下角的红点像素在纹理空间中要占据多少范围(即右图中的不规则四边形区域)。因为MipMap只能在正方形范围内进行查询,所以我就只要求在纹理空间中左下角的像素到上下两个像素距离的最大值,然后将这个最大值作为正方形范围的边长(因为在像素空间中,两个像素之间的距离就是一个像素正方形的边长大小,所以在纹理空间中也是求响铃像素的距离作为原像素点在纹理空间中所占范围的大小

图片

Minmap结果

图片

可以看到结果过度模糊了

图片

为什么会Overblur

MipMap只能在一个方形的区域内查询,如果不是方形区域呢?后面的三线性插值都是一个近似的估计,近似的太多,远处就会出现这样一种过度模糊的效果

解决方案(各向异性过滤(Anisotropic Filtering))

原文出处

MipMap的工作:给一张原始的图,长宽各缩小一半,做的就是下图中对角线上的工作。

图片

但是有一些图的长款并不同,MipMap则没有功能对这些图进行处理。可以看到上图中,在水平方向上,高度没有变,但是宽度被不断的压缩,而在竖直方向,宽度没有变,高度被不断的压缩。也就是说,各向异性过滤比MipMap多做了这些工作,能够为宽高不均匀的图片进行压缩。

图片

从上图中可以看出,屏幕上的像素映射到纹理空间上时,并不总是一个规则的形状,可能会出现这种斜的长方形,数值的长方形或者别的形状。

如果在长方形上还用正方形来进行范围查询,那么就会在一个很大的并且多余的范围内进行查询,精度就会下降,所以就会更糊,而用长方形的范围查询则能够直接在目标区域上进行范围查询,效果就会更好,至于斜的长方形,用各向异性过滤也会出现在一个比原来更大的长方形范围内进行范围查询,所以还需要别的方法来解决。

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

games101笔记 Shading 的相关文章

  • Servlet学习(六):Response对象

    1 Response设置响应数据功能介绍 HTTP响应数据总共分为三部分内容 分别是响应行 响应头 响应体 对于这三部分内容的数据 respone对象都提供了哪些方法来进行设置 响应行 对于响应头 比较常用的就是设置响应状态码 void s
  • docker Error response from daemon 解决

    docker Error response from daemon pull access denied for xxx repository does not exist or may require docker login denie
  • Android Studio 导入Eclipse项目

    将Eclipse项目或者其他的Android项目导入Android 会因为项目结构不一样 或者下载的grandle版本不一致 经常会导致import project卡死 解决的简单办法 首先 打开Android studio 然后impor
  • Linux shell:判断变量是否包含某个字符串的几种方法

    方法一 利用grep查找 strA long string strB string result echo strA grep strB if result then echo 包含 else echo 不包含 fi 先打印长字符串 然后在
  • Vuejs Prop基本用法

    一 使用Prop传递数据 组件实例的作用域是孤立的 这意味着不能并且不应该在子组件的模板内直接引用父组件的数据 可以使用props把数据传给子组件 prop是父组件用来传递数据的一个自定义属性 子组件需要显示的地用props选项声明 pro
  • 异常:java.lang.ClassNotFoundException: org.springframework.web.servlet.Dispatcher

    首先声明一点 导致这个异常的情况有很多种可能 我只是说一下我遇到的异常解决办法 java lang ClassNotFoundException org springframework web servlet Dispatcher 可能原因

随机推荐

  • Wwise音频解决方案概述

    Wwise编辑器 音频设计师在Wwise编辑器 具体使用请参考 Wwise Help 中完成声音的集成和设置 并通过UE4和unity的Wwise插件 将制作好地资源导入到游戏编辑器中 Wwise编辑器是一款插件式架构的工具 其功能由众多插
  • 使用vue+百度接口实现关键词搜索

    html代码块 div 请输入关键词 div
  • Java11安装遇到C:\ProgramData\Oracle\Java\javapath\java.exe”

    1 官网下载java11 发现根本就找不到了 官网上放置的是最新的 之前版本我找不到 只有去别人那里拿 如果你刚好也想要 可以私聊我 我到时候发给你 2 下载完成直接下一步安装就OK了 但会发现只有jdk没有jre 其实根本没必要生成出jr
  • el-dialog实现可拖曳并且可点击底层页面

    el dialog实现可拖曳并且可操作底层页面 拖曳 1 新建文件 directives js import Vue from vue v dialogDrag 弹窗拖拽属性 Vue directive dialogDrag bind el
  • 【海思SS626

    目录 一 概述 二 安装交叉编译工具 2 1 安装 aarch64 mix410 linux tgz 2 2 安装 cc riscv32 cfg11 musl 20220523 elf tar gz 2 3 检查工具链版本 打印版本则表示安
  • Android 性能优化系列:启动优化进阶

    文章目录 启动速度优化的本质因素 CPU 层面进行速度优化 减少程序的指令数 降低时钟周期时间 降低每条指令的平均时间周期 缓存层面进行速度优化 缓存的读写速度 缓存的命中率 任务调度层面进行速度优化 通过实时进程和普通进程了解任务调度机制
  • 有了 screen 和 nohup 跑深度学习代码再也不用愁了

    在服务器上跑深度学习代码 xshell断开代码就挂掉了 如何能在服务器运行程序的时候 即使关闭终端也不会影响代码呢 screen 我用的是screen 推荐这个方法 我感觉比nohup好用一万倍 1 连接服务器 下图我连接了88 99 这个
  • java基础学习总结——面向对象1

    目录 一 面向过程的思想和面向对象的思想 二 简单理解面向对象 三 面向对象的设计思想 四 对象和类的概念 五 如何抽象出一个类 六 类 对象 之间的关系 七 Java与面向对象 八 为什么使用面向对象编程 一 面向过程的思想和面向对象的思
  • [C++]:for循环for(int num : nums)

    前言 时不可以苟遇 道不可以虚行 一 基于范围的for循环的基本语法 在c 11里 为for循环 添加一个container 它就会自动迭代 实现了对于vector型变量vec的内容打印 变量i遍历vector中的每一个元素 直到vecto
  • 解决RabbitMQ报错问题

    解决RabbitMQ报错问题 rabbitmq server service RabbitMQ broker Loaded loaded usr lib systemd system rabbitmq server service disa
  • 周志华《机器学习》课后习题解答系列(六):Ch5.10 - 卷积神经网络实验

    本系列相关答案和源代码托管在我的Github上 PY131 Machine Learning ZhouZhihua 卷积神经网络实验 手写字符识别 注 本题程实现基于python theano 这里查看完整代码和数据集 1 基础知识回顾 1
  • 使用PowerShell脚本来一键开启、关闭FTP服务

    可以使用PowerShell脚本来实现这一目标 下面是两个简单的PowerShell脚本 一个用于开启FTP服务 另一个用于关闭FTP服务 开启FTP服务 保存以下脚本为 Enable FTP ps1 开启IIS和FTP功能 Enable
  • Nextjs 的 App Router 路由模式核心概念简介

    Nextjs App Router 简介 Next js 13 引入了新的应用路由器 它建立在服务端组件之上 支持布局 嵌套路由 加载状态 错误处理等等 本文将介绍 App Router 新路由模型的基本概念 术语 树 Tree 一种用于可
  • neo4j--Cypher语法练习(LOAD CSV)

    1 21 LOAD CSV LOAD CSV用于从CSV文件中导入数据 CSV文件的URL可以由FROM后面紧跟的任意表达式来指定 需要使用AS来为CSV数据指定一个变量 LOAD CSV支持以gzip Deflate和ZIP压缩的资源 C
  • el-form表单回车提交,浏览器会刷新页面

    当el from 只有一个输入框时候 回车提交表单 刷新页面 原因 由于当表单只有一文本框时 按下回车将会触发表单的提交事件 从而导致页面刷新 解决办法 在 el from 加上 submit native prevent
  • 【经典】华为远程机试题分享(跟进)

    在上一篇博客中有说到面试的具体事儿 昨晚那种方法做出来之后 感觉可读性不好 也就是一般情况下很难看懂代码 所以接近睡着时我又想到一个办法比较简单 而且易懂 所以写这篇博客和大家分享一下吧 具体就围绕下图这个核心问题来做 其实我的想法很简单
  • 【Espruino】NO.18 使用L298N驱动直流电机

    http blog csdn net qwert1213131 article details 38584743 本文属于个人理解 能力有限 纰漏在所难免 还望指正 小鱼有点电 Espruino中文社区 小学时代玩过玩具四驱车 各种奇葩霸气
  • ChatGPT写小论文

    ChatGPT写小论文 只是个人对写小论文心得 从知乎 知网自己总结的 有问题 可以留个言我改一下 别删我的东西啊CSDN 文章目录 ChatGPT写小论文 1 写小论文模仿实战 狗头 0 小论文组成 1 好论文前提 2 标题 3 摘要 4
  • Transformer(三)--论文实现:transformer pytorch 代码实现

    转载请注明出处 https blog csdn net nocml article details 124489562 本系列传送门 Transformer 一 论文翻译 Attention Is All You Need 中文版 Tran
  • games101笔记 Shading

    什么是shading 不同的物体应用不同的材质的过程 就是计算出物体具体应该在的地方 物体的光照 物体本身应该有的材质 Blinn Phong Reflectance Model Blinn Phong反射模型 Blinn Phong Re