笔记当前的Unity版本:2019.3
当前最新的Unity版本:2020.2
URP自学笔记4. 纹理贴图和法线纹理
笔记当前的Unity版本:2019.3
当前最新的Unity版本:2020.2
1.概述
在该节中,我们主要了解一下如何绘制纹理贴图,包括两部分,普通的纹理绘制和法线纹理绘制。其中相对较为复杂的也就是法线计算这块。不过体量就那么大,搞个10遍8遍的,再笨的人也懂了。
2.普通纹理绘制
在原来的CG语法当中,当属性中定义了一个纹理类型的变量
Properties{
_MainText("Main Texture",2D) = "white"{}
}
我们想要在CGPROGRAM中引用这个纹理,就需要声明一个采样器。
sampler2D _MainTex;
而在HLSL中,sampler2D这个对象被拆分为两部分,即纹理对象和采样器。你需要同时声明两个变量来保存它们。如下所示。
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
/* 声明主纹理并且为主纹理设置一个采样器,没有什么说法,这是一种固定的格式。
主纹理的声明同属性的声明,注意类型为TEXTURE2D,采样通过SAMPLER来定义,括号中的
名字为采样器的变量名,变量名为sampler_纹理名,由于我们这里的纹理名为MainTex,
所以,采样器为sampler_MainTex*/
之后,你需要通过采样器函数SAMPLE_TEXTURE2D来对他们进行采样。
half4 albedo = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.uv);
以上就是HLSL中关于采样这部分的变动了。其他的地方保持不变。以下是完整的代码。
Shader "URPNotes/Sampler2D"{
/* 关于HLSL的2D采样器 */
Properties{
_BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0)
_MainTex("Main Texture",2D) = "white"{}
}
SubShader{
Tags{
"RenderType"="Opaque"
"RenderPipeline"="UniversalRenderPipeline"
}
pass{
HLSLPROGRAM
#pragma vertex Vertex
#pragma fragment Pixel
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
/* 声明主纹理并且为主纹理设置一个采样器,没有什么说法,这是一种固定的格式。
主纹理的声明同属性的声明,注意类型为TEXTURE2D,采样通过SAMPLER来定义,括号中的
名字为采样器的变量名,变量名随意,但同样遵循一般命名原则。*/
CBUFFER_START(UnityPerMaterial)
half4 _BaseColor;
float4 _MainTex_ST;
//_MainTex_ST,当定义一张纹理的时候,该纹理的uv坐标的缩放与偏移会
//整