shader入门精要 读后总结

本文概述了GPU渲染过程,包括CPU如何加载网格、设置渲染状态和触发drawcall,详细解析了图形管线的各个阶段,如顶点着色器、片元着色器、模板测试、深度测试等。此外,还探讨了纹理采样、透明度测试、混合模式以及矩阵变换在Shader中的应用,是Shader初学者的宝贵总结。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



1cpu把网格从硬盘加载到显存

2cpu设置网格的渲染状态,哪个网格用哪个shader

3cpu告诉gpu渲染这个drawcall


drawcall理解为cpu对gpu发起一个命令。此命令指向需要被渲染的图元列表,不包含任何材质信息


顶点数据->顶点着色器(模型坐标到投影坐标)->裁剪(摄像机外的扔掉,一半一半的构建新顶点)->屏幕映射

              ->三角形设置(计算边上对应的像素)->三角形遍历(插值生成包含的片元)->片元着色器->逐片元操作->输出


片元->模板测试->深度测试->混合->颜色缓存区

-----

透明测试

-----

模板缓存区,深度缓存区,透明缓存区,颜色缓存区

----

命令缓存区,cpu不断插入,gpu不断读取,cpu速度一般跟不上





===================

_mainTex("Main Tex"),2d) = "while" {}

========

sampler2D _MainTex   //属性表的右边贴图

float4 _MainTex_ST     //属性表的左边属性

====

o.uv = i.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;

o.uv = TRANSFORM_TEX(v.texcoord, _MainTex)

//i.texcoord 也是uv

写在顶点着色器

=====

fixed3 albedo = tex2D(_MainTex, i.uv)

写在片元着色器

====

mul(矩阵,向量)

(float3x3)矩阵

(向量).xyz

降纬度

==

升维度

fixed4(i.color,1)

==

逐个顶点进行计算

逐个片元进行计算  更加平滑的光照效果

====


物体渲染:

1先渲染所有不透明物体,并开启深度测试和深度写入

2半透明物体从远到近 排序,顺序渲染,开启深度测试,关闭深度写入

开深度测试是为了在不透明的物体后的 不需要渲染, 关闭深度写入是为了 透明物体之后的透明物体也渲染

====

透明度测试:

clip(texColor.a  - _Cutoff)

相当于

if((texColor.a - _Cutoff) < 0)

discard;

要么完全显示,要么完全不显示

===

Blend SrcAlpha OneMinusSrcAlpha

正常混合

目标 = 源*源alpha + 目标*(1-源alpha)

===

cull back | front | off

默认是back不显示

一个平面2个面,back不显示的话,翻过平面会看穿


====

矩阵补充:

坐标轴c下的点a要转换到坐标轴p上

需要矩阵  []*a

矩阵的表现形式为  坐标轴c的x轴,y轴,z轴,原点在坐标p上的表示 

以列排序 ,

第一行则为p的x轴在c下的表示

由于方向没位置,所以一般只需要3*3

//因此转置可以得到逆矩阵(前提正交矩阵)

//法线需要逆转置矩阵

//mul(m,v)

//mul(v,m)= mul(tran(M),v)

=====

??什么时候需要归一化

??什么时候float4,float3,什么时候.xyz

xyz为取 x,y,z坐标做成(x,y,z)

颜色什么时候+ 和*

====

fixed3 worldNormal = normalize(mul(v.normal, (float3x3)_World2Object))

逆转置

object2World 的逆是world2object,转置为交换2者顺序


=====


float3 binormal = cross( normalize(v.normal),normalize(v.tangent.xyz)  ) * v.tangent.w;

float3x3 rotation = float3x3(v.tangent.xyz, binormal, v.normal);

//或者声明 TANGENT_SPACE_ROTATION;

o.view = mul(rotation, objSpaceviewdir(v.vertex)).xyz

====

fix3d3 tangentNormal;

tangentNormal.xy = (packedNormal.xy*2-1);

tangentNormal.z = sqrt(1.0= saturate(dot(tangentNormal.xy, tangentNormal.xy)));

//或者声明

tangentNormal = UnpackNormal(packedNormal);


===


float3 worldPos = mul(_object2world, v.vertex).xyz;

fixed3 worldNormal = unityobjecttoworldnormal(v.normal);

fixed3 worldtangent = unityobjecttoworlddirv.tangent.xyz);

fixed3 worldbinormal = corss(worldNormal. worldtangent) * v.tangent.w;


o.ttow0 = loat4(worldtangent.x, worldbinormal.x, worldnormal.x, worldpos.x);

o.ttow1 = loat4(worldtangent.y, worldbinormal.y, worldnormal.y, worldpos.y);

o.ttow2 = loat4(worldtangent.z, worldbinormal.z, worldnormal.z, worldpos.z);


bump = normalize(half3(dot(i.ttow0.xyz, bump),dot(i.ttow1.xyz,bump),dot(i.ttow2.xyz,bump) ));











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值