当前位置: 首页 > news >正文

计算机图形学入门11:图形管线与着色器

1.什么是图形管线

        把场景中的物体经过一系列的处理,最后一张图像的形式在屏幕上显示出来,这一系列过程就是图形管线(Graphics Pipeline),也叫实时渲染管线(Real-time Rendering Pipeline)。如下图所示,为整个渲染管线的过程。

        渲染管线从上到下依次完成以下步骤:
        1.获取到场景中三维空间中的一些顶点。
        2.经过投影变换,将这些点转换到屏幕坐标系下。
        3.将这些点拼装成不同的三角形。
        4.通过光栅化,将三角形离散成不同的着色点,也就是片元(Fragment)。
        5.着色计算,给不同片元进行光照计算等处理。
        6.输出到屏幕上。

        这些步骤都是在硬件GPU上写好的。

        着色(Shading)会同时发生在顶点处理阶段(Vertex Processing)片元处理阶段(Fragment Processing),这个是因为考虑不同的着色频率。如果使用的是顶点着色(Gouraud Shading),对每个顶点进行着色处理那就发生在顶点处理阶段,如果使用的片元着色(Phong Shading),对每个片元(像素)进行着色,那么就发生在片元处理阶段。在现代的GPU里,这套渲染管线允许有一部分是可编程的,这部分就叫做着色器(Shader),用来控制顶点和像素是如何进行着色的。

2.着色器

        在上述已经说明了,在现代的GPU里,渲染管线允许有一部分是可编程的,在顶点和片元处理阶段,对顶点和片元(像素)是进行如何着色,这就是着色器(Shader)

        Shader本质上是能够在硬件上执行的语言,举一个OpenGL上GLSL语言的例子,如下图所示,OpenGL是图形学中的一个API,可以写Shader。

        Shader中每一个顶点或像素执行一次,写一个函数都是通用的,每一个像素都会执行,只需要操作一个顶点或像素。GPU都是并行计算的,运输性能远超CPU。

        对顶点进行着色的叫做顶点着色器(Vertex Shader),对片元(像素)进行着色的叫做片元着色器(Fragment Shader)。随着现代GPU的发展,出现了几何着色器(Geometry Shader),可以动态产生更多的三角形,对几何的操作。还出现了Compute Shader,它不仅仅是图形学内部的计算,还可以做各式各样通用的GPU计算。

        练习Shader可以去Shadertoy BETA网站。以下图片是使用Shader实现的一个例子。

相关文章:

  • fs模块(一)
  • Day07-06_13【CT】LeetCode手撕—1. 两数之和
  • Vue主要使用-03
  • mysql之数据聚合
  • 用python纯手写一个日历
  • 数字化校园:打造未来教育新风尚
  • 每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割
  • 分类预测 | Matlab实现基于Transformer多特征分类预测/故障诊断
  • Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包
  • 中文大数据训练的数据集
  • C# OpenCvSharp Mat操作-创建Mat-构造函数
  • 什么是中断?STM32F407中断处理
  • 【Android面试八股文】讲一讲String、StringBuffer和StringBuilder在进行字符串操作时候的效率
  • 基于dagger平台实现资源位的接口自动化
  • 力扣hot100:75. 颜色分类(双指针)
  • 【Leetcode】101. 对称二叉树
  • [数据结构]链表的实现在PHP中
  • 【译】理解JavaScript:new 关键字
  • Angular 4.x 动态创建组件
  • ComponentOne 2017 V2版本正式发布
  • css布局,左右固定中间自适应实现
  • ECMAScript入门(七)--Module语法
  • Git 使用集
  • Java Agent 学习笔记
  • Javascript弹出层-初探
  • JavaScript设计模式与开发实践系列之策略模式
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • python大佬养成计划----difflib模块
  • Redis在Web项目中的应用与实践
  • Redux系列x:源码分析
  • 初识 beanstalkd
  • 简析gRPC client 连接管理
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 悄悄地说一个bug
  • 什么是Javascript函数节流?
  • 学习笔记TF060:图像语音结合,看图说话
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​io --- 处理流的核心工具​
  • # C++之functional库用法整理
  • #单片机(TB6600驱动42步进电机)
  • $NOIp2018$劝退记
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)二分查找 超详细
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (分布式缓存)Redis哨兵
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)jQuery 基础
  • (转)mysql使用Navicat 导出和导入数据库
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu