GAMES101(7~8节,着色,插值,渲染流水线)

news2024/9/21 17:58:18

Shading着色

光线传播越远,强度越小

冯氏光照 / Blinn-Phong着色模型:

环境光(常量):颜色 * 强度

法线n,观测方向v,光照方向I,反射光线R,半程向量H(V和I的角平分线)光泽度shininess,自身颜色color

//

漫反射

两个性质:

能量守恒(决定到达的能量):

求半程
  1. 光的传播过程中,总能量保持不变,反射的能量不能超过入射的能量
  2. 入射光的能量等于反射光和折射光的总能量

余弦定理(决定接受的能量):I与n夹角越大,物体表面接受的光照总量越小,即点乘结果

镜面反射

漫反射:kd为本身的颜色 * 到达能量 * 吸收的比率

//

R和V夹角越近,颜色强度越大,等价于,H和n的夹角

指数P

半程向量 = I + V / || I + V || 归一化(仅方向)

指数p:比如没有指数,在比如45的角度下看平面,会看到比较大的高光区域,因为cos值仍比较大,因为对于很多点都有比较亮的高光

镜面:ks为高光的颜色(通常为白色) * 到达能量 * 看到高光的比率,指数p(通常为100~200)

插值

问题:  即使只为平面传入了4个顶点,片段着色器依然能够正确地为整个平面的每个像素(片段)计算光照和颜色?

这是因为进行了线性插值:已知数据点之间估算中间数据值的过程,插值的目的是通过已知顶点的属性,计算出多边形内部任意位置的属性值。

插值的不同类型

  1. 线性插值:这是最常见的方式。在顶点之间进行线性插值,得到内部片段的属性。它根据片段距离每个顶点的比例来插值数据。

  2. 重心插值:这是光栅化过程中使用的一种特殊插值方法。重心插值通过三角形的重心坐标(barycentric coordinates),根据片段相对于每个顶点的重心坐标

  3. 透视校正插值:在3D场景中,由于透视投影的存在,单纯的线性插值可能导致错误的结果。因此,OpenGL会使用透视校正插值,确保在透视投影下的正确性。

理解框架中插值:

l​​​​​这篇计算插值的方式讲的很清楚可以看到,对于普通的线性插值,和权重有关,

对于例如三角形内部重心插值,和三角形面积有关

注意如何求每个三角形面积,根据叉乘,首先求出平行四边形面积(两个向量叉乘的结果) / 2= 三角形面积

如下computeBarycentric2D函数计算点(x,y)在三角形被3个顶点v0v1v2,影响的权重比(对应3个三角形面积 / 总面积),也就是求出3个面积 / 总面积即可

最后利用abg的3个权重值,计算采样点的z深度值

//计算坐标在三角形的重心坐标
static std::tuple<float, float, float> computeBarycentric2D(float x, float y, const Vector3f* v)
{
    float c1 = (x*(v[1].y() - v[2].y()) + (v[2].x() - v[1].x())*y + v[1].x()*v[2].y() - v[2].x()*v[1].y()) /
     (v[0].x()*(v[1].y() - v[2].y()) + (v[2].x() - v[1].x())*v[0].y() + v[1].x()*v[2].y() - v[2].x()*v[1].y());
    float c2 = (x*(v[2].y() - v[0].y()) + (v[0].x() - v[2].x())*y + v[2].x()*v[0].y() - v[0].x()*v[2].y()) /
     (v[1].x()*(v[2].y() - v[0].y()) + (v[0].x() - v[2].x())*v[1].y() + v[2].x()*v[0].y() - v[0].x()*v[2].y());
    float c3 = (x*(v[0].y() - v[1].y()) + (v[1].x() - v[0].x())*y + v[0].x()*v[1].y() - v[1].x()*v[0].y()) /
     (v[2].x()*(v[0].y() - v[1].y()) + (v[1].x() - v[0].x())*v[2].y() + v[0].x()*v[1].y() - v[1].x()*v[0].y());
    return {c1,c2,c3};
}
// 
std::tie(alpha, beta, gamma) = computeBarycentric2D(i+a[k], j+a[k+1], t.v);//重心插值
float w_reciprocal = 1.0/(alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());//透视校正
float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
z_interpolated *= w_reciprocal;//得到校正后的深度z值

3种着色方式: 

Face Flat平面着色:对每个三角形四边形有相同的法线,法线根据三角形边两个两个插值得到,因此每个三角形内部有完全一致的结果

Vertex Gouraud顶点着色:对每个顶点着色,内部用插值计算颜色,结果近似

Pixel Phong像素着色:着色应用在每个像素上,法线方向在内部插值,有更精确的结果

//

这里如何求法线平均?

比如某顶点是周围三角形的公有顶点,求这个顶点的法线,就是其他的三角形法线方向的加权平均值

渲染流水线

渲染流水线:将 3D 场景 转换为 2D 图像的过程

  • 渲染流水线(Rendering Pipeline):侧重于 GPU 内部的处理阶段,尤其是渲染的各个阶段如何协作从 3D 数据生成图像。更具技术细节,描述数据如何在 GPU 上流动。

  • 渲染管线(Render Pipeline):是一个更宽泛的概念,涵盖了从场景数据组织到图形渲染的全流程,包括 CPU 端的场景管理、资源调度、API 调用以及 GPU 的流水线处理。

  • 图形管线(Graphics Pipeline):主要描述图形 API(如 OpenGL、Vulkan 等)如何控制 GPU 渲染阶段。更注重图形 API 的设计和其对 GPU 的控制流程。

Shader:是渲染流水线中可编程的部分,

和作业框架不同,使用图形api时,对于顶点或片段的操作应写在shader中,对于opengl来说需要用glsl语言,directx需要hlsl语言……

当bind绑定shader并调用drawcall时,会自动(非for循环)对每个顶点计算位置和片段/像素计算颜色,运行绑定的着色器

  • 顶点着色器(Vertex Shader):处理每个顶点的输入,计算坐标变换、法线变换、纹理坐标等。

  • 片段着色器(Fragment Shader):处理光栅化后每个像素(片段)的颜色、纹理映射、光照计算等。

  • 几何着色器(Geometry Shader):可选阶段,用于在顶点之后、光栅化之前对几何体进行修改。

  • 计算着色器(Compute Shader):独立于渲染流水线,可以用于并行处理复杂计算任务,比如物理模拟、流体模拟等。

GPU:执行渲染流水线,并以极高的效率并行执行流水线中的任务。

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

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

相关文章

【RabbitMQ】工作模式

工作模式概述 简单模式 简单模式中只存在一个生产者&#xff0c;只存在一个消费者。生产者生产消息&#xff0c;消费者消费消息。消息只能被消费一次&#xff0c;也称为点对点模式。 简单模式适合在消息只能被单个消费者处理的场景下存在。 工作队列模式&#xff08;Work Qu…

计算机毕业设计Django+Vue.js考研分数线预测 考研院校推荐系统 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习 深度学习

考研推荐系统— 项目概述 考研&#xff08;研究生入学考试&#xff09;是许多大学毕业生追求深造的一种途径。为了帮助考生更好地选择适合自己的研究生专业和院校&#xff0c;开发一个考研推荐系统可以为考生提供个性化的建议。该项目旨在通过数据分析和可视化技术&#xff0…

[晕事]今天做了件晕事44 wireshark 首选项IPv4:Reassemble Fragented IPv4 datagrams

不知不觉&#xff0c;已经来到了晕事系列的第四十四个晕事。今天办的晕事和Wireshark查看网络包相关。说&#xff0c;在Wireshark的编辑-首选项协议里的IPv4协议&#xff0c;有一个参数设置是&#xff1a;Reassemble Fragented IPv4 datagrams。 这个参数的含义是指定Wireshar…

第 7 篇 Helm 部署 Nacos【详细步骤】

文章目录 安装 Chart准备工作单机 MySQL 模式第 1 步&#xff1a;自定义配置第 2 步&#xff1a;安装 chart第 3 步&#xff1a;查看状态查看 Pod 运行状态查看 Pod 信息 第 4 步&#xff1a;访问 Nacos集群外访问集群内访问 集群 MySQL 模式第 1 步&#xff1a;自定义配置文…

Java 入门指南:Java 并发编程 —— 同步工具类 Phaser(相位器)

文章目录 同步工具类Phaser主要特点核心方法使用步骤适用场景使用示例 同步工具类 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 提供的用于并发编程的工具类库&#xff0c;其中包含了一些通信工具类&#xff0c;用于在多个线程之间进行协调和通信&#xff0c;特别…

Ton链历险记(一)

系列文章目录 文章目录 系列文章目录前言第一天、FunC环境安装总结 前言 欢迎来到神秘的web3小镇&#xff0c;这里是充满未知和魔法的土地&#xff0c;神兽出没&#xff0c;超能力攻击&#xff0c;卡牌收集。。。 穷困却又励志的无天赋法师木森。因为没有交够保护费&#xff…

Spring和Spring FrameWork有什么关系?两者是同一个东西吗?

Spring和Spring Framework之间的关系可以归结为以下几点&#xff1a; 广义与狭义的理解 广义上的Spring&#xff1a; 广义上的Spring泛指以Spring Framework为基础的整个Spring技术栈。Spring已经发展成为一个由多个不同子项目&#xff08;模块&#xff09;组成的成熟技术体系…

R语言统计分析——功效分析2(t检验,ANOVA)

参考资料&#xff1a;R语言实战【第2版】 1、t检验 对于t检验&#xff0c;pwr.t.test()函数提供了许多有用的功效分析选项&#xff0c;如下&#xff1a; pwr.t.test(n,d,sig.level,power,type,alternative) 其中&#xff0c;n为样本大小&#xff1b; d为效应值&#xff0c;即…

【每日一题】LeetCode 98.验证二叉搜索树(树、深度优先搜索、二叉搜索树、二叉树)

【每日一题】LeetCode 98.验证二叉搜索树&#xff08;树、深度优先搜索、二叉搜索树、二叉树&#xff09; 题目描述 给定一个二叉树的根节点 root&#xff0c;判断该二叉树是否是一个有效的二叉搜索树&#xff08;BST&#xff09;。有效的二叉搜索树需要满足以下条件&#xf…

R语言xlsx,txt文件处理:以《书摘》00年-10年资源合集整理为例

偶然间读到一篇文章&#xff0c;分享06年《书摘》的内容&#xff0c;今天来看都不过时&#xff0c;所以起了找下这本老杂志合集的心思。 傅佩荣先生《哲学与人生》选段 “如果有人觉得活着很辛苦&#xff0c;面对自己又感觉无聊乏味&#xff0c;那么他应该多接触自然界。我有个…

9.11.

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(this)) {//设置时钟ui->setupUi(this);startTimer(1000);//文本框label居中对齐ui->label_2->setAlignment(Qt::AlignCenter);connect(this,&Widget::my_sign…

QT:音视频播放器

目录 一.播放器设计 二.需要使用的控件 三.选择视频 四.播放视频 五.暂停视频 六.关闭视频 七.播放状态设置 八.切换视频(上一首) 九.切换视频(下一首) 十.设置视频滑块 十一.更新滑块显示 十二.实现效果 十三.代码设计 1.mainwindow.h 2.mainwindow.cpp 一.播放…

国产视频转换HDMI1.4转单/双MIPI DSI/CSI LT6911C芯片方案,带音频输出,QFN64封装 Lontium

LT6911C:HDMI 1.4 TO MIPI DSI/CSI 芯片简介&#xff1a; LT6911C是一款高性能的HDMI1.4转换器MIPI DSI/CSI芯片用于VR/智能手机/显示应用。对于MIPI DSI/CSI输出&#xff0c;LT6911C功能可配置单端口或双端口MIPIDSI/CSI 1高速时钟通道和1~4个高速数据通道最大1.5Gb/s/lane&am…

SSHamble:一款针对SSH技术安全的研究与分析工具

关于SSHamble SSHamble是一款功能强大的SSH技术安全分析与研究工具&#xff0c;该工具基于Go语言开发&#xff0c;可以帮助广大研究人员更好地分析SSH相关的安全技术与缺陷问题。 功能介绍 SSHamble 是用于 SSH 实现的研究工具&#xff0c;其中包含下列功能&#xff1a; 1、针…

【算法思想·二叉搜索树】特性篇

本文参考labuladong算法笔记[二叉搜索树心法&#xff08;特性篇&#xff09; | labuladong 的算法笔记] 1、概述 首先&#xff0c;BST&#xff08;binary search tree&#xff09; 的特性大家应该都很熟悉了&#xff08;详见基础知识章节的 二叉树基础&#xff09;&#xff1a…

【QGC】把QGroundControl地面站添加到Ubuntu侧边菜单栏启动

把QGroundControl地面站添加到Ubuntu侧边菜单栏启动 简介准备工作步骤 1: 创建 Desktop Entry 文件步骤 2: 编辑 Desktop Entry 文件步骤 3: 刷新应用程序菜单步骤 4: 将 QGroundControl 固定到侧边栏 环境&#xff1a; Ubuntu &#xff1a;20.04 LTS 简介 QGroundControl 是…

[综述笔记]Federated learning for medical image analysis: A survey

论文网址&#xff1a;Federated learning for medical image analysis: A survey - ScienceDirect 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&…

C++ Primer Plus(速记版)-基本语言

序章 快速入门 初窥输入/输出 C 并没有直接定义进行输入或输出(I/O)的任何语句&#xff0c;这种功能是由标准库提供的。 本书的大多数例子都使用了处理格式化输入和输出的 iostream 库。 iostream 库的基础是两种命名为 istream 和 ostream 的类型&#xff0c;分别表示输入流和…

卷积神经网络-经典分类网络结构(LetNet-5,AlexNet)

目录 一&#xff1a;LeNet-5解析 1.网络结构 输入层&#xff1a; 1.conv1&#xff1a; 2.pool1层&#xff1a; 3.conv2&#xff1a; 4.pool2&#xff1a; 5.fc3&#xff0c;fc4&#xff1a; 6.output层: 2.参数形状 二&#xff1a;AlexNet 1层&#xff1a; 2层&am…

招生管理|基于Java+vue的招生管理系统(源码+数据库+文档)

招生管理|学生管理系统|高校招生管理 目录 基于Javavue的招生管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|…