【计算机图形学入门】笔记8:Shading 2着色(着色频率、图形管线、纹理映射)

news2024/10/1 3:28:56

08Shading 2着色(着色频率、图形管线、纹理映射)

  • 前置知识
    • 1.Specular Term 高光
    • 2.Ambient Term 环境光照项
    • 3.最终的成像公式
  • 2.着色频率
    • 1.Flat shading
    • 2.Gouraud shading
    • 3.Phong shading
    • 4.那么如何计算逐顶点法线?
    • 5.如何定义逐像素的法线?
  • 3.Graphics (Real-time Rendering)Pipeline 图形(实时渲染)管线
    • 1.从场景到最后一张图中间到底经历了什么?
      • 1.Vertex Processing顶点处理
      • 2.Triangle Processing三角形处理
      • 3.Rasterization光栅化
      • 4.Fragment Processing片段处理
    • 2.Shader
        • 案例:OpenGL上的fragment shader
  • 3.纹理映射Texture Mapping
    • 1.Different Colors at Different Places?
    • 2.纹理案例

前置知识

1.Specular Term 高光

由于观察方向与镜面反射方向,也就是v(相机视线的方向向量(v))和R(反射光线的方向向量(R))足够接近的时候,就得到了一个高光项。

请添加图片描述

V close to mirror direction = half vector near normal (半程向量和法线接近) V和R接近=h和n接近

半程向量h是l和v的角平分线向量

为什么要替换用n和h替换原来的R和v?

因为R点乘v要求出反射光线R向量,虽然不是不可以,但是比较麻烦,计算量大。所以Blinn提出来了一个天才般的想法:
不去计算R与v的夹角余弦,而是去计算v和入射方向I的角平分线 与 表面法线的夹角余弦。于是就定义了这个角平分线为h。

如果不用这个技巧的模型,被称为Phong模型。利用这个技巧的,才叫Blinn-Phong模型。

Blinn-Phong模型大大简化了计算。因为计算反射方向是一件很繁琐的事情(想想看找到某个向量以另一个向量为轴的对称向量,并不是一件很容易的事情)。

如何衡量两个向量接近?——使用点乘

两个向量越近,点乘结果越接近1,两个向量越远,点乘结果越接近0

请添加图片描述
ks是镜面反射系数,通常认为是白的

问题:为什么不再考虑多少能量被这个点真正吸收了?

实际如果我们要做的对的话,我们确实需要在这个镜面反射上仍然要考虑多少能量被吸收,也就是有之前一项l和n的点乘。但是这里没有考虑是因为Blinn-Phong是经验性模型,把这一点简化掉了,我们主要关注的是我们是否能看见高光,是否我的这些方向保证了我能够看到高光,就是n和h足够接近。

问题:为什么多出来了一个指数P?

指数P用来控制高光有多大,因为cosin函数太平缓了,不够陡峭,所以高光的范围太大了,为了让高光范围小一点,我们可以取P次方。(P一般可以取100~200之间)

请添加图片描述

随着指数P的增长,我可以看到越来越小的高光。Ks是镜面反射系数,表示亮度。

请添加图片描述

2.Ambient Term 环境光照项

茶杯有些地方根本不可能直接被光源照亮,但它却不是暗的。因为有很多光线可以弹射很多次,然后从四面八方打到任何一个其他的点上。所以对于茶杯背面的点也一样,它能够接收到来自环境的光。

所以我们假设任何一个点接收到来自环境的光永远都是相同的,环境光强度是Ia,Ka是环境光系数。

请添加图片描述

3.最终的成像公式

请添加图片描述

2.着色频率

含义:着色的精密程度。

  • 逐三角形着色。即每个三角形指定一个颜色值。Flat Shading
  • 逐顶点着色。即每个顶点指定一个颜色值。Gouraud Shading(需要插值)
  • 逐像素着色。即每个像素指定一个颜色值。Phong Shading(需要插值)

请添加图片描述

第一个球:把着色应用在面上,认为整个四边形面都长这个颜色。也就是一个平面只做一次shading。

第二个球:每个平面的对4个顶点都算出对应的法线,每个顶点做一次着色,然后通过差值的方法计算四边形内部点的颜色。差值:知道三角形3个顶点的颜色,求其内部的某一个点颜色是什么,并且希望有一个平滑的过渡。

第三个球:shading应用在每一个像素上。对于每个四边形或三角形,顶点求出一个法线,然后把这些法线的方向在三角形内部进行差值,然后就得到了任何一个像素都有一个自己的法线方向,并且可以做一遍着色。

1.Flat shading

每个三角形是个平面,然后把三角形的法线求出来(两边做叉积),然后算出shading的结果。

请添加图片描述

2.Gouraud shading

在任意一个顶点上求出它的法线,每个顶点做一次着色,然后三角形内部的颜色通过差值的方法计算出来。

请添加图片描述

3.Phong shading

先求顶点法线,再每个像素差值出独特的法线向量

请添加图片描述

案例:每一行使用的模型是一样的,当模型本身比较精细的时候,其实用Flat shading比Phong shading更减少计算开销,效果也差不多(如第三行)

请添加图片描述

4.那么如何计算逐顶点法线?

任何一个顶点会和很多个不同的三角形有所关联,那么这个顶点的法线我们就认为它是这个相邻这些面的法线求给4个平均。

一个简单的平均也许说明不了什么问题,比如有一个三角形超级小,有一个三角形超级大,那么这个超级大的三角形应该会贡献的更多,在求平均的过程中做一个加权(三角形的面积)的平均,会得到更好的结果。

请添加图片描述

面片衔接的地方,如何定义法线?

其实很简单,就是把邻接的面片的法线加起来求和(再归一化)就行了。

5.如何定义逐像素的法线?

当有了顶点法线后,使用重心坐标计算出中间的法线

请添加图片描述

3.Graphics (Real-time Rendering)Pipeline 图形(实时渲染)管线

图形管线:从点坐标到在屏幕上绘制图形的全流程

管线:一系列不同的操作

1.从场景到最后一张图中间到底经历了什么?

这一系列操作是在硬件中写好了的,在GPU里面进行

请添加图片描述

1.Vertex Processing顶点处理

其实就是把一些坐标点,通过模型(模型本身的旋转拉伸剪切)、视图(相机的摆放)、投影(透视投影到正交投影再到正则立方体)。以及视口变换(正则立方体到屏幕)

请添加图片描述

2.Triangle Processing三角形处理

这一步其实不需要我们来处理。我们得到模型的时候,一般就得到了顶点的连接关系。也就是指定哪三个顶点连成一个三角形(想一想OBJ文件格式就知道了)

3.Rasterization光栅化

找哪些像素是在三角形内部的。如果在内部,就按照该三角形的颜色值为像素指定颜色。

请添加图片描述

4.Fragment Processing片段处理

片段(fragment)其实就是像素(pixel),只是叫法不同罢了。

首先,做一个深度检测算法,一般是Z-Buffer。按照物体的遮挡关系绘制图形。

其次,根据光源、相机、物体三者的相对位置,绘制物体光暗的变化,也就是着色(shading)。可以使用Blinn-Phong Shading

最后,我们还可以在物体上绘制不同的纹理。例如木头就是木头的纹理,金属就是金属的纹理。不同的物体材质有不同的纹理。
请添加图片描述

2.Shader

对我们程序员来说,GPU厂商和操作系统厂商已经为我们写好了大部分的固定流程。我们无需关心许多千篇一律的流程(因为代码都是一样的,已经被写好了)。而GPU厂商和操作系统为我们留出了一些接口,即API。这就相当于我们可以写许多用户自定义的程序片段。这些程序片段就是shader 程序。这些API就是Shading Language。
请添加图片描述

有两种shader程序:

vertex shader
fragment shader

顾名思义,vertex shader就是允许你在顶点处理的步骤上填写自定义的程序。fragment shader就是允许你在像素处理的时候写自定义的程序。

案例:OpenGL上的fragment shader

作用:告诉GPU每个像素最后的颜色是什么,也就是说对于一个像素来说,我们要写清楚怎么样算它最后的颜色,并且把它输出出去。

请添加图片描述

GPU:高度并行化的处理器。64核:可以并行的线程数量为64。GPU的并行度要远远超过CPU的几十倍。

学到这里,大家就可以去使用像OpenGL这种API去写各种图形渲染了。

3.纹理映射Texture Mapping

1.Different Colors at Different Places?

对于不同的物体来说,显然其上的图案是不同的。

比如气球和木地板,他们的图案就完全不同。我们就称,他们的纹理不同。地板的漫反射:在任何一个地方地板有自己的漫反射系数,反应在木头的这个纹路上,也就是说我们希望在物体不同位置定义一个不同的属性,这就是引入纹理映射的思路。

物体是三维的,但表面都是二维的。纹理就是一张图,这张图我可以任意的把它撕开用其中一块或把它拉伸/压缩,就是认为它是一个有弹性的一张图。然后把它蒙在任何一个三维物体的表面,这个过程就叫做纹理映射。

映射是一个一一对应的关系,物体表面任何一个点与纹理上面任何一个点之前的关系。

如何把空间中的一个三角形映射到一个纹理上呢?

我们默认已经知道了纹理要如何贴到三角形上(美工/艺术家做的事),因为我们在三角形上的任何一个顶点,我们都已经规定了它在纹理上的一个坐标。

2.纹理案例

纹理映射并非一件简单的事情。

我们要实现的实际上是2维平面到3维曲面的映射关系。他们之间一一对应。

在此处,我们以三角形为纹理的最小单元。我们要做的,其实就是找到二维平面上的三角形的坐标值与三维曲面上的坐标值的对应关系。

如图所示。我们定义二维平面的坐标用(u, v)表示。这是因为三维曲面坐标已经用(x, y, z)表示了。所以我们用uv这两个字母。

我们只要记得: (u,v)不过是三维曲面展开到2维平面上的时候,我们自己给定义的坐标值而已。

请添加图片描述

上图中,红色越多代表u坐标越大,绿色越多代表v坐标值越大。

为了统一标准。我们总是让uv值在[0,1]内。

只要知道每个三角形对应的uv值,我们就做好了纹理映射。

此外,纹理是可以不断重复的,就像贴瓷砖一样。美术师只要巧妙地绘制纹理,让重复的地方看不出来接缝。纹理贴图就可以无限地循环复制。

请添加图片描述
请添加图片描述
这种就被称之为tiled texture 因为纹理设计的很好使得其在重复的时候得以无缝衔接。这种纹理的设计需要各种算法。

标注:本章部分笔记内容参考了csdn用户beidou111的笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序之后台交互--首页

目录一、后台准备1、application.yml2、generatorConfig.xml3、WxHomeController4、MinoaApplication.java二、小程序首页动态数据加载及优化1、config/app.js2、util.js3、index.wxml4、index.js5、page.wxs一、后台准备 1、application.yml spring:datasource:#type连接池类…

冰冰学习笔记:管道与共享内存

欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正。 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位…

直播榜单正式上线,超店有数让你数秒内找到热卖直播间和高转化带货达人

众所周知,国内抖音直播带货正处于火爆的状态,大部分电商商家都在抖音通过直播带货实现流量变现。那么TikTok作为国内抖音复制到海外的短视频App,是全球最火爆的App之一,被视为品牌出海的新风口。它的直播变现模式也和抖音大同小异…

ThinkPHP 路由使用

最近在使用ThinkPHP6做项目的开发,故整理了一些常用的路由使用方式, 可以方便之后的使用。 目录 引用路由门面 基础路由 快捷路由 规则表达式 静态地址 静态结合动态地址 方法设置 完全匹配 默认路由规则 设置完全匹配 路由别名 变量规则 局…

再次飙升GitHub榜首?这份“保姆级”的SpringBoot笔记,不服不行

Spring Boot 延续了 Spring 框架的核心思想 IOC 和 AOP,简化了应用的开发和部署,通过少量的代码就能创建一个独立的、产品级别的 Spring 应用。在继承了Spring 一切优点的基础上,其最大的特色就是简化了Spring 应用的集成、配置、开发&#x…

怎样提高美国独立服务器的安全性?

目前,越来越多的用户都开始使用起了美国独立服务器,而这种服务器通常都比共享服务器的安全性要高出许多,但是管理起来比较复杂。下面将为大家介绍怎样才能提高美国独立服务器的安全性,包括下面几点: 1.使用强密码 有时…

队列------数据结构

队列:Queue是一个普通的队列,Deque是一个双端队列 普通的队列:只能是队尾进,队头出; 双端队列:可以从队头进队尾出,也可以从队尾进,队头出,也可以用作一个栈; 1)下面我们来介绍一下Queue的实现方法: 在有容量限制的情况…

你是真的“C”——详解函数递归

详解函数递归运用😎前言🙌一、什么是递归🙌二、递归运用的两个必要条件🙌三、递归与迭代🙌总结撒花💞哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文…

长安链 VM Engine架构设计深度解读

VM Engine是长安链智能合约引擎的推荐选型,采用Docker容器化架构,容器内部由一个任务调度器和多个合约进程组成,实现了多合约隔离与多进程并发,支持独立部署,目前支持Golang语言合约。 1. 背景说明 自2009年11月以来&…

CUDA 冬令营1

基本概念 1.CPU的任务:为串行任务优化 2.GPU的任务:为并行任务优化 3.L4T ubuntu:基于NVIDIA Tegra芯片的ubuntu系统(linux for Tegra) 4.Tegra:继承了ARM CPU 和 NVIDIA GPU的处理器芯片 5.X86&#xff1…

2023京东年货节全民炸年兽活动最详细规则

2023京东全民炸年兽活动规则 1、活动时间 整体活动时间: 2022年12月26日00: 00: 00–2023年01月15日23: 59: 59 2、活动玩法 (1)玩法一:全民炸年兽瓜分10亿压岁钱 活动时间: 2022年12月26日00: 00: 00–2023年01月15日23: 59: 59 (2) 玩法二:每晚8点分百万红包 活动时间…

Houdini和C4D区别在哪?哪个更好用

Houdini和C4D作为当前软件市场上非常热门的设计软件,现在越来越多的小伙伴开始学习。所以咱们今天就从行业应用、建模、动画和使用难易度等进行多方面对比,帮助小伙伴们更清楚地了解这两款软件—— Houdini作为一款非常受欢迎的3D&VFX制作工具&#…

美国公司是如何搞创新的,又是如何失败的......

PARC,施乐帕洛阿图研究中心,和贝尔实验室媲美的IT界圣地。从这里走出了一大批伟大的发明,直接改变了整个计算机行业。Alto PC ,图形用户界面,所见即所得,以太网,PostScript,面向对象…

复购高,退货低的日本市场成为跨境电商新风口,新手如何快速入局

据统计预测,未来几年将会有越来越多的跨境卖家涌入日本电商市场。但由于在语言、文化和消费习惯上存在一定的差异,很多中国卖家并不熟悉日本的文化与市场需求,也很难在短时间内快速适应日本电商平台的运营规则与服务。 日本作为一个经济发达的…

【PS-选区编辑】变换选区、反向命令、建立工作路径

目录 变换选区 1、位置 2、多种操作 反向命令 1、反选选区:ctrlshifti 2、边界 3、平滑 4、扩展和收缩 5、羽化 建立工作路径 变换选区 1、位置 制作了一个制作了选区后,鼠标右击找到【变换选区】,或在【选择】菜单中找到【变换…

JavaScript 入门基础 - 运算符(三)

JavaScript 入门基础 - 运算符(三) 文章目录JavaScript 入门基础 - 运算符(三)1.什么是运算符2.表达式和返回值3.算术运算符概述4. 赋值运算符5.递增和递减运算符5.1 递增和递减运算符概述5.2 递增运算符5.2.1 前置递增运算符5.2.…

Ajax(1)---了解Ajax和XML

目录 Ajax XML了解 Ajax的特点 HTTP协议请求报文与响应文本结构 HTTP 请求报文 响应报文 Ajax AJAX全称为Asynchronous JavaScript And XML,就是异步的JS和XML通过AJAX可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。AJAX不是新…

一篇带你彻底弄懂SpringBoot项目jdk版本及依赖不兼容问题

💟💟前言 ​ 友友们大家好,我是你们的小王同学😗😗 今天给大家打来的是 一篇带你彻底弄懂SpringBoot项目jdk版本及依赖不兼容问题 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞👍 收…

MySQL 大表优化方案

单表优化 读写分离 缓存 表分区 垂直拆分 水平拆分 兼容MySQL且可水平扩展的数据库 NoSQL 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不…

通过Django发送邮件

通过Django发送邮件非常的简单,在Python中已经内置了一个smtplib邮件发送模块,Django在此基础上进行了简单地封装,我们可以在Django的环境中方便的发送邮件。大部分邮件发送成功主要是邮件的参数配置,本文以常用的126邮箱和QQ邮箱…