首页 > 其他分享 >Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping)

Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping)

时间:2024-03-24 12:00:14浏览次数:28  
标签:Pipeline 08 Shader 像素 着色 顶点 Shading 法线

Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping)

Shading frequencies

P1每个面着色一次

P2每个顶点着色一次,每个三角面内插值

P3每个像素着色一次

Flat Shading (逐三角形)

  • 每个三角面是一个平面,只有一个法线
  • 在光滑表面效果不好

Gouraud shading (逐顶点)

  • 每个顶点着色,三角形内部通过插值着色
  • 每个顶点都有法线

怎样获取顶点法线

点法线等于面法线求平均(简单平均或加权平均)

Phong shading (逐像素)

  • 求出三角形三个顶点各自的法线,内部每个像素插值出一个特定的法线方向,对每个像素进行一次着色
  • 不是Blinn-Phong反射模型,这里是Phong着色频率(都是Phong发明的)

如何获得像素法线

通过两个顶点插值出中间的法线(用重心坐标)

三种着色器频率对比

  • 相同顶点下,着色频率越高,结果越好

  • 当模型足够复杂时,着色频率越高,效果提升不一定明显

怎么获得点所相连的三角形?

在模型定义中

Graphics pipeline 图形管线

这里只指实时渲染管线

这些操作是在硬件里(GPU)写好的

在Vertex Processing和Fragment Processing都可以进行着色,取决于采用Gouraud Shading还是Phong Shading(Vertex Shader/Pixel Shader)

控制如何着色的代码叫做shader

Shader Programs

以GLSL为例

Shader对每个顶点或每个像素都会执行,只需要管每个顶点或像素的操作

对顶点的操作叫Vertex Shader

对像素的操作叫Pixel SHader或Fragment 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 texture
	kd *= clamp(dot(-lightDir, norm), 0.0, 1.0);	//Lambertian shading model
	gl_FragColor = vec4(kd, 1.0);					//output fragment color
}

还有如Geometry Shader、Compute Shader等的Shader

Texture Mapping 纹理映射

\(L_d = k_d*(I/r^2)*(n\cdot I)\)

物体不同位置有不同属性,比如可以用纹理记录不同点的漫反射系数

表面是二维的

三维空间的物体,表面是二维的

将纹理应用在表面上

有两种方法

  • 将模型展开,放在纹理的不同位置,由美术完成
  • 参数化,是几何上的研究方向

纹理上的坐标系

无论纹理分辨率为多大,我们都认为\(uv\)坐标为从0到1

标签:Pipeline,08,Shader,像素,着色,顶点,Shading,法线
From: https://www.cnblogs.com/Tellulu/p/18092219

相关文章

  • portfinder.getPort( { port: 8080, // 默认8080端口,若被占用,重复+1,直到找
    https://github.com/wkylin/pro-sale-charge/blob/df7fa93c8673701e6897f18498cab78a7fbb05d7/webpack/webpack.dev.js#L77C1-L92C3constportfinder=require('portfinder')module.exports=newPromise((resolve,reject)=>{portfinder.getPort(......
  • 08-JavaScript事件监听
     <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>JS-事件-事件绑定</title></head><body><!--点击按钮,在控制台打印相关信息--><inputtype="button"......
  • 关于使用PZ6808L开发板,调试USART3的问题分析
    首先,写代码方面相信,大家都可以搞定,网上也有很多人写的程序,这里关于如何驱动USART3,就不进行赘述了。关于这款开发板RS232模块,是给F4使用的,但是他留了两个接线柱,就是F1的USART3的两个接口。接下来就是接线的问题,如下图,将这个4个接线柱,两两交叉进行连接,跳线帽肯定搞不了,如下图......
  • BZOJ2908 又是nand
    BZOJ2908又是nand首先手玩需要计算的值,发现既不满足交换律也不满足结合律,不好维护。对于位运算,常见的考虑分开每一位计算贡献,对于单独一位,计算较为简单。既然计算的值只能按顺序计算,那我们只能考虑树剖(其他数据结构不好维护顺序)。给每一位建一棵线段树,在线段树上维护。注意到......
  • C++ [NOIP2008 普及组] ISBN 号码
    文章目录一、题目描述[NOIP2008普及组]ISBN号码题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2提示二、参考代码一、题目描述[NOIP2008普及组]ISBN号码题目描述每一本正式出版的图书都有一个ISBN号码与之对应,IS......
  • 25计学(11408)考研记录贴
    25计学(11408)考研记录贴背景:广东二本,计算机科学与技术专业23年获ICPC,CCPC和百度之星铜奖,蓝桥睿抗均有国奖,GDCPC铁2021-2023学校算法集训室学生教练深度学习论文在发ing前后端知识完全没学过大学成绩(总之除了数据结构很会,其他完全没学,还好学校考试水):高数75,线代85,概统75,数据......
  • 【数据分享】2008-2022年全国范围逐日NO2栅格数据
    空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000-2022年全国范围逐日的PM2.5栅格数据、2013-2022年全国范围逐日SO2栅格数据、2000-2022年全国范围逐日PM10栅格数据、2013-2022年全国范围逐日CO栅格数据和2000-2022年全国1km分辨率的逐日O3栅格数据(可查......
  • 最详细爬虫零基础教程08——代理IP
    文章目录一、代理IP二、使用步骤三、小案例总结一、代理IP在Python中使用代理IP进行爬虫是一种常见的技术手段,可以在一定程度上解决被网站限制访问的问题。为什么要使用代理IP1.让服务器以为不是同一个客户端在请求2.防止我们的真实IP被泄露被追究使用场景:1.被......
  • P1055 [NOIP2008 普及组] ISBN 号码
    P1055[NOIP2008普及组]ISBN号码[NOIP2008普及组]ISBN号码题目描述每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括\(9\)位数字、\(1\)位识别码和\(3\)位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-6......
  • 【C++ 08】vector 顺序表的常见基本操作
    文章目录前言......