Games101-着色(着色频率、图形管线、纹理映射)

2024-03-27 05:52

本文主要是介绍Games101-着色(着色频率、图形管线、纹理映射),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

着色频率

在这里插入图片描述
从边界可以看出三个球,拥有完全相同的几何形状。但是着色之后结果各不相同
着色频率:着色要应用在哪些点上。
第一个球,把着色应用在一个面上。一个平面只做一次shading。
第二个球,每一个平面有4个顶点,每个顶点都算出对应的法线,进行shading。每3个顶点,可以围成一个三角形,三角形内部的颜色通过插值的方法计算
第三个球,着色应用在每一个像素上。求出每一个三角形的法线,将法线进行插值计算出每一个像素自己的法线,在做一遍着色

Shade each triangle/flat shading

在这里插入图片描述
每一个三角形作为一个平面,将三角形的两条边做一个叉积,求出法线。根据light方向算出shading结果

Shade each vertex/Gouraud shading

在这里插入图片描述
求出每一个顶点的法线,每个顶点进行一次着色,三角形内部的颜色通过插值计算

Shade each pixel/Phong shading

在这里插入图片描述
三角形三个顶点各求出法线,三角形内部每一个像素根据插值求出自己的法线方向,进行着色
在这里插入图片描述
当几何足够复杂的情况下,可以用相对简单的着色频率。
当面的频率已经很更高的情况下,不需要用很高的着色频率
但当三角形面的数量超过了像素数,做flat shading的计算量反而更高
要取决于具体的物体

定义每个顶点的法线在这里插入图片描述

任何一个顶点会和很多个三角形有所关联,则顶点的法线认为是相邻的所有面的法线求平均,根据各个三角形的面积进行加权平均

定义每个像素的法线

在这里插入图片描述
使用重心坐标求插值,注意法线是方向,最终结果要归一化

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

在这里插入图片描述
管线:如何从场景到最后一张图

  1. 输入一系列空间中的点
  2. 三维空间中的点变换投影到屏幕上
  3. 这些点形成三角形
  4. 通过光栅化离散成不同的fragments(类比于像素)
  5. 对像素进行着色,例如如果用了MSAA,就是好多个不同的fragment合成一个像素的着色
  6. 输出到屏幕

第一个大步骤是顶点的处理,各种变换。第二个大步骤是光栅化,涉及到如何采样,如何做深度测试,找到最终能显示在屏幕上的像素。第三个大步骤就是着色
在这里插入图片描述
顶点变换
在这里插入图片描述
采样光栅化
在这里插入图片描述
zBuffer深度缓存
在这里插入图片描述
shading发生在vertex和fragment都有可能,如果phong shading则是在Vertex,如果是flat shading则是在Fragment。
所以要注意顶点如何着色,或者像素如何着色。
现代GPU里允许管线的一些部分是可编程的,可以自己定义顶点或像素如何着色(即Shader)
在这里插入图片描述
纹理映射

Shader

在这里插入图片描述
shader本质上是一些能在硬件上执行的语言
shader是每一个顶点或者每一个像素会执行一次
shader是每一个像素通用的,不用特殊指定哪个像素,所有像素都会执行,因此shader里不需要for循环,只需要处理一个顶点或者一个像素如何运行

如果写的是对顶点的操作,则是顶点着色器/vertex shader
如果写的是对像素的操作,则是像素(片段)着色器/pixel(fragment) shader

上图的例子,像素着色器,要做的是写清楚对一个像素来说怎样算出它的颜色,并且输出出去

在这里插入图片描述
在网页上直接执行shader的一个程序

纹理映射/Texture Mapping

在这里插入图片描述
一个物体每个点公用同一个着色模型,但是希望定义物体上每个点各自的属性,如每个点有自己的光照系数。因此映入纹理映射
在这里插入图片描述
任何一个3维物体的表面都是2维的
因此一个物体的表面可以和一张图有一一对应的关系,即纹理映射
在这里插入图片描述
物体表面上任一三角形的顶点,都能在纹理图片上找到对应的三角形的顶点
在这里插入图片描述
纹理上定义的坐标系:(u,v),u,v的范围默认在[0,1]之间
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一个纹理可以多次应用,不同的位置可以映射到相同的纹理位置上
在这里插入图片描述
tiled纹理:纹理的四周是无缝衔接的

这篇关于Games101-着色(着色频率、图形管线、纹理映射)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W