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

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

posted @ 2024-03-24 11:57  Telluluu  阅读(32)  评论(0)    收藏  举报