【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.hqwc.cn/news/416545.html

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

相关文章

Ps:智能对象

智能对象 Smart Objects可以理解为一个存放图像数据的容器,容器中可以包含像素图像、矢量图像、滤镜效果等。 在 Photoshop 中,将图层转换为智能对象之后,则可以以非破坏性的方式工作,操作的灵活性也更强。 请参阅: 《…

YOLOv8改进 | 进阶实战篇 | 利用YOLOv8进行视频划定区域目标统计计数

一、本文介绍 Hello,各位读者,最近会给大家发一些进阶实战的讲解,如何利用YOLOv8现有的一些功能进行一些实战, 让我们不仅会改进YOLOv8,也能够利用YOLOv8去做一些简单的小工作,后面我也会将这些功能利用PyQt或者是pyside2做一些小的界面给大家使用。 在开始之前给大家推…

Visual Studio中,每次新建文件都会自动出现提前设置好的头文件配置方法

主要是修改 newcfile.cpp 文件,可以用everything或者Listary等软件直接搜索文件,直接跳到第4步 1.图标右击——>打开文件所在位置 2.到达IDE地址后在当前目录下找VC文件夹 3.再找 VCProjectItems 文件夹——newcfile.cpp文件 4.用记事本打开&#xff…

Bit.Store 加密卡集成主流 BRC20 ,助力 BTC 生态 Token 的流动性与消费

“Bit.Store 首创性的将包括 ORDI、SATS、以及 RATS 在内的主流 BRC20 资产集成到其加密卡支付中,通过以其推出的加密银行卡为媒介,助力 BTC 生态 Token 的流动性与消费。” 比特币网络在被设计之初,就是以一种去中心化、点对点的现金系统为定…

深耕文档型数据库12载,SequoiaDB再开源

1月15日,巨杉数据库举行SequoiaDB新特性及开源项目发布活动。本次活动回顾了巨杉数据库深耕JSON文档型数据库12年的发展历程与技术演进,全面解读了SequoiaDB包括在高可用、安全、实时、易用性四个方向的技术特性,宣布了2024年面向技术社区的开…

【RT-DETR有效改进】华为 | Ghostnetv1一种专为移动端设计的特征提取网络

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…

Java基础面试题(五)

Java基础面试题(五) 文章目录 Java基础面试题(五)标识符和关键字的区别是什么?Java 语言关键字有哪些?自增自减运算符移位运算符continue、break 和 return 的区别是什么? 单行注释:…

Qt拖拽事件简单实现

1.相关说明 重写resizeEvent(这个按需重写)、dragEnterEvent(拖拽事件函数)、dropEvent(放下事件函数)&#xff0c;可以将本地图片拖拽到label标签中 2.相关界面 3.相关代码 #include "widget.h" #include "ui_widget.h" #include <QDragEnterEvent>…

zookeeper window 安装

下载 Apache ZooKeeper 解压Zookeeper安装包到指定目录&#xff0c;注意目录不要有空格。 备份zoo_sample.cfg并改名zoo.cfg 注意&#xff1a;此处的路径一定要使用双斜杠" \\ " D:\\apache-zookeeper-3.8.3-bin\\data 新建环境变量&#xff1a;ZOOKEEPER_HOME D…

禅道下载安装

文章目录 一、禅道官网二、安装三、管理员操作四、产品操作五、项目经理操作六、测试操作七、泳道图 一、禅道官网 官网&#xff1a;http://www.zentao.net/ 自己用的话是&#xff1a;开源版 然后一直往下滑&#xff0c;找到windows,此处是最新版本 二、安装 本作者就用以前…

go语言(十)---- 面向对象封装

面向对象的封装 package mainimport "fmt"type Hero struct {Name stringAd intLevel int }func (this Hero) Show(){fmt.Println("Name ", this.Name)fmt.Println("Ad ", this.Ad)fmt.Println("Level ", this.Level)}func (thi…

脆皮大学生,开启自由真我之旅

脆皮大学生&#xff0c;开启自由真我之旅 近几年来&#xff0c;脆皮大学生这个词汇在网络上备受瞩目。形象描绘了一个与传统大学生形象完全不同的群体&#xff0c;他们追求自由自在的生活方式&#xff0c;走在与众不同的道路上。他们在拥有高学历的同时&#xff0c;更懂得享受…