首页 > 其他分享 >Unity Shader入门

Unity Shader入门

时间:2023-10-25 19:36:06浏览次数:27  
标签:入门 fragment shader coordinates Shader Unity BaseMap HLSL

ShaderLab

首先我们创建一个URP工程,然后复制这个地址里的shader。

Unity中的shader以ShaderLab的格式编写。 下面是上面地址复制的ShaderObject

// ShaderLab代码以Shader声明开始。 这个路径决定了Material面板中UnityShader的名字和位置。 Shader.Find也会使用这个路径
Shader "Example/URPUnlitShaderBasic"
{
    // The properties部分包含编辑器能够设置的属性。 
    Properties
    {
        //[MainColor]表示这个变量为Material的主颜色 
        //当你在这里定义属性的时候,你也需要在HLSL代码声明它。 
        [MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)
        //[MainTexture]表示这个变量为Material的主材质
        [MainTexture] _BaseMap("Base Map", 2D) = "white"
    }

    // 包含一个或多个SubShader,Unity选择第一个兼容的SubShader
    SubShader
    {
        // SubShader Tags define when and under which conditions a SubShader block or
        // a pass is executed.
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }


        //Pass是Shader的基本元素。它包含设置GPU状态的指令,以及运行在GPU上的程序。
        Pass
        {
            // The HLSLPROGRAM 包含HLSL程序代码
            // HLSL的语义部分可以看这个地址 https://docs.unity3d.com/Manual/SL-ShaderSemantics.html
            HLSLPROGRAM
            // .#pragma vertex 定义了 vertex shader 函数
            #pragma vertex vert
            // #pragma fragment 定义了 fragment shader 函数
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            //vertex shader 结构体
            struct Attributes
            {
                float2 uv           : TEXCOORD0;  
                float4 positionOS   : POSITION; // 看语义部分
            };

            //fragment shader结构体
            struct Varyings
            {
                float2 uv           : TEXCOORD0;
                // The positions in this struct must have the SV_POSITION semantic.
                float4 positionHCS  : SV_POSITION;
            };

            //HLSL代码声明Property中的属性
            //https://docs.unity3d.com/Packages/[email protected]/manual/writing-shaders-urp-unlit-texture.html
            CBUFFER_START(UnityPerMaterial)
                float4 _BaseMap_ST;
                half4 _BaseColor;
                TEXTURE2D(_BaseMap);
                SAMPLER(sampler_BaseMap);
            CBUFFER_END

            Varyings vert(Attributes IN)
            {

                Varyings OUT;

                // The TransformObjectToHClip 函数将顶点坐标从模型空间转化到裁剪空间 

                // 坐标变换看这个 https://www.bilibili.com/video/BV1Uu411w71V/
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);

                OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);

                // Returning the output.
                return OUT;
            }

            // The fragment shader definition.
            half4 frag() : SV_Target
            {
                half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
                return color * _BaseColor;
            }
            ENDHLSL
        }
    }
}

内容补充

HLSL语义

Vertex Shader 输出的结果会在光栅化后通过interpolation处理传递给每个像素的 fragment Shader。

为什么Clip Space被称为Homogeneous Clip Space

坐标系的介绍

After the eye coordinates are transformed by multiplying GL_PROJECTION matrix, the clip coordinates are still a homogeneous coordinates. It finally becomes the normalized device coordinates (NDC) by divided by the w-component of the clip coordinates. —— gl projection matrix

为Shader编写UI

标签:入门,fragment,shader,coordinates,Shader,Unity,BaseMap,HLSL
From: https://www.cnblogs.com/dewxin/p/17787862.html

相关文章

  • 在Houdini中创建布料,并导入到Unity中
    在Houdini中创建一个具有物理效果和贴图的布料,导入到Unity中,实现一个效果良好的、可以与模型互动、有贴图的静态布料模型。参考视频:Houdini+Unity2021制作布料全流程!_哔哩哔哩_bilibili1、创建节点首先创建一个obj文件:随后右键这个节点,创建一个DigitalAssret。进入Typ......
  • 3.3 Tessellation Shader (TESS) & Geometry Shader(GS)
    一、曲面细分着色器的应用海浪,雪地等与置换贴图的结合二、几何着色器的应用几何动画草地等(与曲面着色器结合)三、着色器执行顺序1.TESS的输入与输出输入Patch,可以看成是多个顶点的集合,包含每个顶点的属性,可以指定一个Patch包含的顶点数以及自己的属性功能将图元细分(可以是三角形,矩形......
  • 鸿蒙极速入门(三)-TypeScript语言简介
    ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前,需要先了解一下TS语言的基础知识。一、基础类型1.数字类型-number双精度64位浮点值。它可以用来表示整数和分......
  • Unity DOTS系列之BlobAsset核心机制分析
     最近DOTS发布了正式的版本,我们来分享一下DOTS里面BlobAsset机制,方便大家上手学习掌握UnityDOTS开发。BlobAsset概叙DOTS提供了BlobAsset机制来把数据生成高效的二进制数据。BlobAsset的数据是不可变的。BlobAsset只支持非托管类型数据。支持Burst编译器编译出来的类型。同......
  • TypeScript入门到精通——TypeScript类型系统基础——函数类型
    函数类型一、常规参数类型 在函数形式参数列表中,为参数添加类型注解就能够定义参数的类型。例如,在下列中将add函数声明中的参数x和参数y的类型都定义为number类型。functionadd(x:number,y:number){returnx+y;} 针对函数表达式和匿名函数,我们也可......
  • Unity游戏排行榜的制作与优化
    游戏排行榜是一个很重要的功能,在弱联网的单机游戏与网络游戏中排行榜都是非常重要的,今天我们来详细的讲解游戏排行榜的制作方案,主要有4个点:  游戏排行榜排序核心算法的实现 排序在游戏开发中是一种十分重要的算法,特别是对于海量的数据,高效的排序算法,是核心与关键,排行......
  • Unity DOTS系列之Filter Baking Output与Prefab In Baking核心分析
     最近DOTS发布了正式的版本,我们来分享一下DOTS里面Baking核心机制,方便大家上手学习掌握UnityDOTS开发。今天给大家分享的Baking机制中的FilterBakingOutput与PrefabInBaking。FilterBakingOutput机制在默认情况下,Baking会为每个GameObject生成的Entity与Component,......
  • Unity 3D定点数物理引擎实战系列
    1.1 BEPUphysicsint3D定点数物理引擎介绍 帧同步的游戏中如果用物理引擎,为了保证不同设备上的结果一致,需要采用定点数来计算迭代游戏过程中的物理运算。也就是我们通常说的定点数物理引擎(确定性物理引擎)。本系列教程给大家详细的讲解如何在你的项目中内置一个确定性物理引......
  • Unity 3D定点数物理引擎实战系列2
    1.2 BEPUphysicsint定点数3D物理引擎使用上一节給大家介绍了BEPUphysicsint的一些基本的情况,这节课我们来介绍它的基本使用,本节主要从以下5个方面来介绍:(1) 创建一个物理世界Space,并开启模拟迭代;(2) 添加一个物理物体Entity到世界;(3) 物理引擎的基本处理与操作使用;(......
  • bilibili B站:makefile 编译Linux C/C++项目快速入门
    视频摘自:https://www.bilibili.com/video/BV1vg41177zT    ......