shader 入门精要笔记)(1)
shader只是渲染流水线的一个环节,真正要写shader绕不开堆渲染流水线的整个了解.首先渲染流水线是类似工场流水线的形式提高效率,使多个物体和场景的顶点,纹理,转换成屏幕图像,由CPU和GPU共同处理。《Real_Time Readering,Third Editor》将渲染流程分为三个阶段:1.应用阶段,2.几何阶段,3.光栅化阶段。(只是概念阶段,实际其每个阶段也是一个流水线系统,即包涵子流水线阶段)
应用阶段:开发者对此有绝对控制权,由CPU负责实现。为何这样说呢?实际上开发者在此可以控制模型顶点数量,场景的模型摆放,摄像机位置,光源的控制,提高渲染性能必须要有取舍,对于不可见的物体进行粗粒度剔除(culling),由此不必使下一个阶段处理几何信息和图形采样,最后设置渲染状态(漫反射颜色,高光反射颜色,贴图纹理,使用的shader类型)渲染图元(点,线,三角面)传入给下一个几何阶段。应用阶段结束。
几何阶段: 这一阶段在GPU上进行。几何阶段负责和每个渲染图元打交道,逐顶点,逐多边形操作,重要的是把顶点坐标变换到屏幕空间中,再交给光栅器处理,通过对输入的图元处理后,将输出的屏幕空间二维顶点坐标,每个顶点的深度值(模型顶点不可能十分规则,通常物体的形状分布是由三维软件中对物体顶点挤压变形最终形成的视觉上规整的形状,顶点深度值就是对此的计算)着色(通常由美术在对shander颜色面板操作后对RGB颜色的调整)等相关信息,交给下一个阶段。几何阶段结束
光栅化阶段:使用上一阶段(几何阶段)传递的数据产生屏幕上的像素,渲染出最后的图像。此阶段也在GPU上进行,光栅化任务是决定每个渲染图元中的哪些像素应该被绘制在屏幕上,它需要对上一阶段得到的逐顶点数据(纹理坐标,顶点颜色)进行插值,然后逐像素处理,光栅化阶段和几何阶段类似,也可以分成更小的流水线阶段。
总结:以美术生的视角来看:shader的整个流程类似我们要画出的画面,在应用阶段是我们对画面要画什么,哪些位置画什么,用什么颜色来画,对于不重要的东西少画或者不画。在几何阶段我们大脑中有这些想法后传给我们的手,把脑子里的画面先进行一个模拟对画面最终效果进行预测,对具体的调色和画面进行更一步规整。光栅化阶段:两次想法验证就需通过手了,通过手对画面进行具体的调整,先画整体,再画细节,对色彩进行调整哪些灰一些,哪些冷一些,哪些亮一些,明暗更加突出,亮面,高光,明暗交界线,反光突出。总之计算机就像一个上帝画家一样,它可以准确画到一切你告诉他的信息,它不会出错(除非你告诉他的是错误信息),但是不必要的信息就不要告诉他了,他也会累的,让他画特别多的东西且在几秒内,这也是不切实际的(暗指剔除,节省性能)
原文地址:https://www.cnblogs.com/rw61/p/15123253.html
- spring整合quartz
- android沉浸式状态栏的实现
- Jayrock: JSON and JSON-RPC for .NET
- rabbitMQ教程(三) spring整合rabbitMQ代码实例
- 谈谈序列化—实体bean一定要实现Serializable接口?
- Kafka源码系列之通过源码分析Producer性能瓶颈
- 微软在动态语言支持上超越了Java?
- JAVA图片批量上传JS-带预览功能
- Netty-Websocket 根据URL路由,分发机制的实现
- DrawerLayout实现网易新闻抽屉效果
- shiro权限控制(一):shiro介绍以及整合SSM框架
- websocket(三) 进阶!netty框架实现websocket达到高并发
- Kafka源码系列之Broker的IO服务及业务处理
- Dubbo(五) Dubbo入门demo——helloworld
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Rust日报】2020-07-30 fixed_vec减少Rust数组冗余边界检查
- 我的小工具,用C和python实现远程读卡器,远程读写消费卡片
- c语言实现TCP的socket通信
- 多文件目录Makefile的写法
- 一个有趣的例子带你入门canvas
- GitLab 12 跨版本 13 升级
- 【Rust日报】2020-07-28 SO:在命令行下浏览StackOverflow
- 【翻译】200行代码讲透RUST FUTURES (6)
- MPU6050姿态解算方式1-DMP
- 打卡群刷题总结0729——分隔链表
- 单细胞tSNE细胞降维图还可以这样做?!
- 从IIC实测波形入手,搞懂IIC通信
- FreeRTOS例程4-串口DMA收发不定长数据
- FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用
- 前端如何将json数据导出为excel文件