【GAMES101】Lecture 08 图形管线(实时渲染管线)与纹理映射

目录

图形管线

纹理映射


图形管线

给我一个三维模型,给我一个光照条件,我就能够得出渲染的结果,这些东西合起来就是Graphics Pipeline,图形管线,闫神愿称之为实时渲染管线,那下面这个流程图就是这个渲染流水线

对于给我的这个三维模型的点,首先通过投影变换到平面上,然后这些点会形成三角形,我们需要将这个三角形显示在屏幕上,但是这个屏幕是离散的,我们通过光栅化离散这个三角形,形成这个fragments,这个是OpenGL里面的概念,叫片段、片源、片元,就类似于我们着色时的像素,然后就对每个像素进行着色,完了就可以显示在屏幕上,这个就是渲染的流水线,就是从三维场景渲染出二维屏幕的操作

我们来举个例子,我们之前说的Model, View, Projection transforms,就是这个MVP变换,是对每个顶点做这么一个变换

然后对于顶点形成的三角形我去采样,去判断这个在不在三角形内部,这个是光栅化

然后通过这个深度缓冲来解决这个光栅化过程中这个fragments远近的问题

再然后着色的时候,我们说有不同的着色频率对不对,有平面着色、顶点着色和像素着色,那么这个着色就会发生在处理顶点和处理fragments的时候,这也是为什么会有两个着色器的原因,就是vertex shader和fragment shader,这个着色器shader就是一段代码,这个代码呢就是控制这个顶点和这个fragment是如何进行着色的,等下会分析一个shader

还有就是真实的三角形它其实不同的地方会有不一样的这个纹理,这个操作叫纹理映射,稍后会讲

然后我们来看一个shader,这个shader是一个可以在硬件执行的语言,专门写给GPU跑的,GPU核又多又轻量是吧,就是用来干这个简单的并行计算的,然后这里举了个OpenGL的shader语言GLSL,注意一个shader它是通用的,不需要为每个顶点或者每个fragment写一个,当然顶点着色器和片元或者是像素着色器需要分开

终于看见代码了是吧,狂喜……这个着色器就是完成这个着色的过程,这个uniform指的是全局变量,一个纹理一个光照方向对吧,这个uv呢是一个纹理坐标(u,v)二维向量,这个norm就是法线三维向量,这个kd是漫反射系数,跟这个纹理有关哈,然后去计算这个光照,拿这个光照方向和法线方向做点乘得到余弦值还记得吗,然后用这个clamp限制在0到1之间,shader瞬间入门属于是

uniform sampler2D myTexture;       // program parameter 
uniform vec3 lightDir;             // program parameter 
varying vec2 uv;                   // per fragment value (interp. by rasterizer) 
varying vec3 norm;                 // per fragment value (interp. by rasterizer) 
void diffuseShader() 
{ vec3 kd; kd = texture2d(myTexture, uv);                // material color from texturekd *= clamp(dot(–lightDir, norm), 0.0, 1.0);  // Lambertian shading modelgl_FragColor = vec4(kd, 1.0);                 // output fragment color 
}

闫神提到的一个网站Snail (shadertoy.com)可以通过编写shader感受不同的渲染效果

纹理映射

在着色的时候,我们说一个三维物体它不同表面的纹理可能是不一样的,三维物体它的表面应该是二维的,好比这个地球仪,我们把它表面给展开得到一个二维的纹理,那么三维物体表面上一点就会对应展开的二维纹理上的一点,那么它们之间就会存在一种映射的关系

那怎么操作呢,比方说下面这个独眼哥,我怎么将这个纹理给它映射上去呢,取一个三角形小块,如果我知道这一块三角形在纹理上的对应位置,那是不是就可以找到对应的点给它上色是吧?

但是这个事情我怎么知道呢o.O?

这个有两个解决办法,一个是在这个三维模型创造的时候就展开得到这个纹理图,这个对应关系是由这个艺术家(美工)完成的;还有一个就是参数化,就是给我一个模型,我能够自动的展开纹理并且得到这个对应关系,这个很复杂很难

反正我们就是可以知道这个纹理对于三维物体的对应位置

 然后每个顶点都会分配这个纹理的坐标(u,v)

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

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

相关文章

redisson的延时队列机制简述

概述 业务中经常会遇到一些延迟执行的需求;通常想到的都是rabbitmq或者rocketmq的延迟消息; 但是系统中不一定集成了mq,但为了控制分布式下的并发,一般redis都是有集成的; redis的key过期监听那个时间不准确&#xff…

Load Config

Go语言抽象能力弱是语言特性限制的。 如下用工厂模式实现两种配置加载的逻辑。 获取配置方式一: func GetConfig[T any]() T {switch any(*new(T)).(type) {case Config1:return any(Config1{}).(T)case Config2:return any(Config2{}).(T)default:return any(Conf…

GIS复试Tips(特别是南师大)

注:本文仅个人观点,仅供参考 在这提前㊗️24年考南师大GISer成功上岸! 当然,考研是个考试,总有人顺利上岸,稳上岸或逆袭上岸,但可能也有人被刷,这是常态。 所以,㊗️你…

Kylin安装学习教程

Kylin(通常指的是Apache Kylin)是一个开源的分布式分析引擎,提供Hadoop之上的SQL接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发并贡献至开源社区。它能在亚秒级查询PB级数据。以下是一…

【linux】docker下nextcloud数据迁移

首先进行数据备份,找到nextclou的 /www/html/data/admin/files 对admin用户下的文件进行备份。然后在新电脑下执行以下操作: 1、切换root sudo su - 2、切换apt下载源 vi /etc/apt/sources.list 清华源 # 默认注释了源码镜像以提高 apt update 速度&…

idea设置编辑器背景颜色

文章目录 一、Ided常用工具栏显示二、更改idea主题设置三、设置代码编辑器背景颜色为豆沙绿四、设置新项目 默认Jdk配置、maven配置1、settings for new projects2、structre for new projects 五、修改代码中注释的字体颜色六、设置编辑器字体大小七、文件编码的设置(可以设置…

DC-1靶机刷题记录

靶机下载地址: 链接:https://pan.baidu.com/s/1GX7qOamdNx01622EYUBSow?pwd9nyo 提取码:9nyo 参考答案: https://c3ting.com/archives/kai-qi-vulnhnbshua-tiDC-1.pdf【【基础向】超详解vulnhub靶场DC-1】 https://www.bilibi…

禅道:从安装到使用,一篇文章带你全面了解

博客前言: 在这个充满竞争和快节奏的世界里,项目管理已经成为了许多行业的关键环节。禅道作为一种功能强大、易用的项目管理工具,正在被越来越多的企业和团队所采用。它不仅能帮助我们高效地管理项目,还能提升团队协作和沟通的效…

6、Numpy形状操纵

目录 1. 使用 reshape 改变形状 2. 使用 resize 改变大小和形状 3. 使用 ravel 或 flatten 展平数组 4. 使用 -1 推断尺寸 5. 使用 newaxis 增加维度 6. 使用 squeeze 移除单维度条目 1. 使用 reshape 改变形状 对于任何 NumPy 数组,你可以使用 reshape 方法来…

为什么JavaScript中0.1 + 0.2 ≠ 0.3

JavaScript中的浮点数运算有时候会出现一点偏差。下面解释为什么0.1 0.2 ≠ 0.3,以及如果你需要精确运算应该怎么做。 如果1 2 3,那么为什么在JavaScript中0.1 0.2 ≠ 0.3?这个原因与计算机科学和浮点数运算有关。 我建议你打开浏览器的控制台,输入0.1 0.2来查看结果。…

【leetcode100-042/043】【二叉树】二叉搜索树的转换和验证

【转换】 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 思路: 可以说是递归板子题了。每次把…

带你学C语言-指针(4)

目录 ​编辑 ⚾0.前言 🏀1.回调函数 ⚽2.qsort 🏉2.1 qsort函数的模拟实现 🎾3.sizeof与strlen对比 🎾4.结束语 ⚾0.前言 言C之言,聊C之识,以C会友,共向远方。各位CSDN的各位你们好啊&…

【JS逆向学习】36kr登陆逆向案例(webpack)

在开始讲解实际案例之前,大家先了解下webpack的相关知识 WebPack打包 webpack是一个基于模块化的打包(构建)工具, 它把一切都视作模块 webpack数组形式,通过下标取值 !function(e) {var t {};// 加载器 所有的模块都是从这个…

【RocketMQ每日一问】RocketMQ nameserver的作用是什么?

Name Server 在 Apache RocketMQ 集群中扮演着以下几个重要作用: 服务注册与发现: Name Server 负责管理和协调整个集群,维护集群中所有 Broker 的信息,包括 Broker 的 IP 地址、端口号、存储容量等。当 Producer 和 Consumer 需…

【消息队列】RocketMQ 生产和消费中的集群模式和广播模式

在消息队列系统中,生产者和消费者的模式通常包括集群模式和广播模式。这两种模式分别用于不同的场景,具有不同的特点和优势。 1. 集群模式(Cluster Mode): 在集群模式下,多个相同角色的实例组成一个集群&…

太帅了 soeasy两行命令创建一个文件系统

看三遍 看三遍 看三遍 A file list program that supports multiple storage, powered by Gin and Solidjs. 翻译:一个支持多个存储的文件列表程序,由Gin和Solidjs提供支持。 1.安装 命令1:创建目录 mkdir -p /opt/alist 命令2:创建容器 docker run -d \ --res…

Cookie同源策略

同源策略(Same-Origin Policy)是浏览器安全机制的一部分,用于限制一个源(域名、协议和端口的组合)的文档或脚本如何与来自另一个源的资源进行交互。这个策略帮助防止潜在的恶意网站在用户浏览器中执行恶意操作。 关于C…

细胞基因完整矩阵转10xGenomics稀疏矩阵文件

经常分析单细胞数据的同学都知道,10x Genomics 的细胞基因矩阵通常存储在三个关键文件中,这些文件共同描述了单细胞测序数据。这三个文件分别是: Barcodes.tsv,通常是一列多行,每一行代表一个细胞。 Features.tsv&am…

一天吃透Redis面试八股文

目录: Redis是什么?Redis优缺点?Redis为什么这么快?讲讲Redis的线程模型?Redis应用场景有哪些?Memcached和Redis的区别?为什么要用 Redis 而不用 map/guava 做缓存?Redis 数据类型有哪些&…

UE5 C++ 基础变量类型,关于框架的初级练习

一.创建自己的MyGameModed。并在其中设置好GamePlay框架。 1.创建MyGameState,MyGameState,MyHUD,MyPawn,MyPawn,MyPlayerController,MyPlayerState。 2.并在MyGameMode的头文件里面,把GmaeMode里的框架需要的框架类都包含进去。 3.写一个构…