【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…

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

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

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…

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

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

为什么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来查看结果。…

带你学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…

一天吃透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.写一个构…

用微服务快速开发框架实现流程化办公!

实现流程化办公,可以助力企业提升市场竞争力,从而实现数字化转型升级。微服务快速开发框架是提升办公协作效率的得力助手,流辰信息以市场为导向,坚持自主研发与创新,始终为行业的进步和发展贡献应有的力量。 1、流程化…

【EI会议征稿通知】2024年通信技术与软件工程国际学术会议 (CTSE 2024)

2024年通信技术与软件工程国际学术会议 (CTSE 2024) 2024 International Conference on Communication Technology and Software Engineering (CTSE 2024) 2024年通信技术与软件工程国际学术会议 (CTSE 2024)将于2024年03月15-17日在中国长沙举行。会议专注于通信技术与软件工…

LLaVA-Plus:多模态大模型的新突破

前言 随着AIGC技术的不断进步,各类多模态大模型(MLM)开始蓬勃发展。在这一领域中,LLaVA-Plus的推出无疑是一次重大突破。作为LLaVA团队的最新工作,LLaVA-Plus不仅继承了LLaVA的优秀特性,还在此基础上进行了…

ChatGPT提示词保姆级教程

现在越来越多提示词教程,本文列个清单,方便以后整理,不定期更新,欢迎关注留言! 后续更新欢迎关注 提示词(prompt)出来后,被称为一个新的岗位诞生,面向提示词工程师。 …

dns正反解析配置

1.配置正向解析baidu.com 1、下载bind包 [rootlocalhost ~]# yum install bind -y 2、对配置文件修改 [rootlocalhost ~]# vim /etc/named.conf 3、对数据文件修改 [rootlocalhost ~]# vim /var/named/baidu 4、重启服务 [rootlocalhost ~]# systemctl restart named.service 5…

hash应用

目录 一、位图 1.1、引出位图 1.2、位图的概念 1.3、位图的应用 1.4、位图模拟实现 二、布隆过滤器 2.1、什么是布隆过滤器 2.2、布隆过滤器应用的场景 2.3、布隆过滤器的原理 2.4、布隆过滤器的查找 2.5、布隆过滤器的插入 2.6、布隆过滤器的删除 2.7、布隆过滤器…

行云部署前端架构解析-前言 | 京东云技术团队

一个简单的自我介绍 项目规模 截止目前上万次代码提交,总代码行数1超过21万行,其中人工维护的代码超过 13万行,近千个文件。 前端线上服务直接对接的后端服务,达十多个。 跟很多应用一样, 它有行云的入口, 也有独立的服务, 还…