Advertisement

《Unity Shader入门精要》笔记(一) 预备知识及数学基础

阅读量:

第一章 简介

nothing


第二章 渲染流水线

  1. 什么是流水线? 什么是管线

GPU渲染的过程就流水线。

这里写图片描述
  1. Shader在管线中的位置? Shader能做到那些功能,做不到哪些?
shader的位置

为什么裁剪在顶点、几何着色器之后? 几何着色器可能会修改顶点。

  1. 什么是DrawCall? DC为什么慢?

DrawCall是一种CPU发起的一次图形渲染请求,在这一过程中需要传递的具体信息包括颜色、纹理等细节内容。由于CPU和GPU之间存在一种协作关系,在这种情况下两者的协作效率可能会受到影响。

  1. 着色器需要完成什么?
  1. 顶点着色器的主要功能是实现顶点坐标从模型空间到屏幕空间的映射与转换。为什么片元着色器无法执行这一操作?因为片元着色器必须先确定哪些像素会被绘制出来才能进行计算,而屏幕坐标尚不清楚的情况下无法直接将三角形转换为屏幕上具体的面。
  2. 顶点着色过程既可以计算颜色信息也可以避免计算颜色信息。
  3. 片元着色单元针对每个像素独立进行操作,在处理时互不影响且能够并行处理。

第三章 Unity Shader基础

  1. 什么是材质?Unity中如何使用Shader?

  2. 什么是ShaderLab?如何写ShaderLab?

Unity提供了一种描述性语言,其独特的语法体系使其相较于常规Shader编程更为便捷。

复制代码
    Shader "shaderName"

    {
    Properties {
        _Color ("Main Color", Color) = (1,.5,.5,1)
    }
    SubShader
    {
        Tags { ... }
        Pass
        {
            Tags { ... }
            CGPROGRAM
            // code here
            ENDCG
        }
    }
    Fallback "Diffuse"
    }
  1. Fallback是用来干嘛的?

这相当于备用的Shaders名称,在后续部分中会涉及一些内部Shaders的名字。如果前面的各种subshaders无法满足需求,则可能意味着需要一个替代方案Plan B。然而需要注意的是,并非所有后续的一些专用于屏幕后处理的Shaders都需要依赖于Plan B。
也就是说,在某些特定情况下选择性地应用这些后处理Shaders能够实现更高的效率。

  1. 表面着色器是啥玩意?

Unity自行定义的顶点与片元着色器类型,在引擎内部会将这些着色器进行自动转换为顶点和片元着色器。
在处理多光源方面更为便捷的情况下,这些技术细节可能会生成多个pass等技术细节。
由Unity的渲染工程师Aras发明。
这位专家主张将顶点与片元着色器的抽象方式进行调整,并认为正确的划分方法应为表面着色器、光照模型以及光照着色器。
这样一来,在实际应用中相对较为简便。


第四章 学习Shader需要的数学基础

左手与右手坐标系之间的区别是什么?如何区分左右坐标系?在Unity中采用的是哪一类型?

在Unity中采用了左手坐标系作为基础设置。然而,在观察空间中,则采用了右手坐标系。那么为什么呢?这是否是一种约定俗成的规定?还不清楚。

  1. 矢量、向量的运算
  1. 向量A与B之间的点积定义为A·B=|A||B|cosθ,在分析两向量之间的夹角时这一指标具有重要意义。
  2. 当单位向量\vec{b}与非零向量\vec{A}进行点乘运算时所得结果等同于\vec{A}\vec{b}方向上的投影长度。
  3. 向量叉乘运算的结果是一个垂直于原两向量所在平面的新矢量,在此背景下可将其称作法线方向单位矢量。值得注意的是该运算不符合交换律即有A×B=-B×A
  4. 在直角坐标系中对于三个基本轴X,Y,Z存在以下关系式:Z=X×Y,Y=Z×X,X=Y×Z这种关系遵循固定的循环规律只需按照X→Y→Z的方向依次进行即可记住
  1. 旋转的正方向?

在左手坐标系中,在相对于旋转轴的正方向呈顺时针转向的方向定义为该相对旋转轴的正方向;通过将左手的大拇指沿着该旋转轴的正方向伸展,则四指的弯曲方向即为旋转向量的正向。

  1. 矩阵的简单运算

对于正交矩阵:

  1. 空间变换

已知B空间中的三个轴在A空间中的表示方式,则将这三个轴按照列向量的形式排列所构成的矩阵即为此处的空间转换关系对应的变换矩阵。
例如给定模型空间中的三个轴向量分别为X(a,b,c)、Y(j,k,l)、Z(e,q,w),则这些轴向量组成的列向量即构成了从模型空间到A空间(如世界坐标系)的空间转换关系。
那么这种形式的原因是什么呢?理解这一原理对于后续学习具有重要意义。
值得注意的是,在计算机图形学中,默认情况下我们通常会使用单位基底来进行各种计算与变换操作。
具体而言,在三维几何中我们通常采用笛卡尔坐标系来进行描述与计算。
另外一种理解方法是针对给定的世界坐标V_w来说,在模型坐标系下的表示可以通过对每个基底进行投影来获得新的坐标值。
具体来说根据前面所提到的点积投影定义我们可以得到以下等式:
M * V_c = V_w
其中M代表从模型坐标系到世界坐标的转换矩阵V_c代表模型坐标的点或向量V_w则代表其在世界坐标的对应位置。
进一步地我们可以将其变形得到:
V_c = M^{-1} * V_w
也就是说如果我们将世界坐标的点或者向量应用该逆变换操作就可得到其在模型坐标系下的表示。
这样我们就得到了从世界坐标系到模型坐标的变换关系矩阵。
需要注意的是这种变换仅在模型所处的空间依然是正交基底的情况下才是有效的。
只有这样才能保证变换过程中的几何关系得以正确保持并应用于后续计算过程中。

  1. 法线变换为什么不能跟普通的变换使用同一个矩阵?

根据法线的定义可知 \vec V \cdot \vec N = 0V_xN_x + V_yN_y + V_zN_z = 0 假设存在一个缩放矩阵:
同样地 经过变换后得到的新法向量为 (\tilde{N}_x, \tilde{N}_y, \tilde{N}_z) = (N_x, 2N_y, N_z) 我们再计算此时点积的结果为:

V_x\tilde{N}_x + V_y\tilde{N}_y + V_z\tilde{N}_z = V_x N_x + 4V_y N_y + V_z N_z

N_y \neq 0 的情况下结果显然不等于零 因此这种情况下新得到的结果不再满足原有的条件 即新的法向量已经不再是"真实的"法线了
那么如何找到合适的变换矩阵呢?由此可得 法向量需要施加怎样的变换才能保持其性质
因此 我们可以通过分析上述关系式来确定合适的约束条件 最终得出结论:为了使缩放后的结果仍能保持为有效的"法线" 应该使用原始变换矩阵转置后的逆矩阵来进行转换 即:

(M^T)^{-1}

其中当缩放因子一致时 可以直接采用原始正交矩阵本身来进行转换

  1. 透视投影。

计算好复杂

  1. Unity中常用的一些矩阵变量。

地址在这里

全部评论 (0)

还没有任何评论哟~