Unity Shader 入门笔记(二)

这篇具有很好参考价值的文章主要介绍了Unity Shader 入门笔记(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity Shader 入门笔记(二),图形学,unity,笔记,游戏引擎

前言

前一篇Unity Shader 入门笔记 (一)中,我们学习和了解了Shader程序是什么以及Unity Shader代码的主要结构和相关含义,本篇文章中我们将进一步学习和了解Shader程序如何编写。

1. 写一个简单的Shader程序

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "My Shader/SimpleShader01"
{
    SubShader
    {
        Pass{
            CGPROGRAM
            //声明顶点着色函数 vert是顶点着色函数名字
            #pragma vertex vert
            //声明片元着色函数 frag是片元着色函数名字
            #pragma fragment frag
            
            // POSITION / SV_POSITION 是 CG/HLSL 的语义
            float4 vert (float4 v : POSITION) : SV_POSITION
            {
                //注意:MVP变换就是将模型空间转化到裁剪空间
                return UnityObjectToClipPos(v);
            }

            //SV_Target 是HLSL中的系统语义,
            //它等同于告诉渲染器,将用户输出的颜色存储到一个渲染目标上
            //这里输出到默认的帧缓存上
            fixed4 frag () : SV_Target
            {
                return fixed4(1.0, 1.0, 1.0, 1.0);
            }
            ENDCG
        }
    }
}
1.1. 代码运行效果

Unity Shader 入门笔记(二),图形学,unity,笔记,游戏引擎

1.2. 代码解释

我们在上面的代码中使用了POSITION,那么填充POSITION、NORMAL、TEXCOORD这些语义中的数据从哪里来?

在Unity中,由使用该材质的MeshRender组件提供。在每帧调用DrawCall的时候,MeshRender组件会将它负责渲染的模型数据发送给UnityShader。

一个模型通常包含了一组三角面片,每个三角面片由3个顶点构成,而每个顶点又包含了一些数据,例如顶点位置、法线、切线、纹理坐标、顶点颜色等

通过上面的方法我们就可以在顶点着色器上访问这些数据了。

从上面获取到的数据是物体模型空间下的顶点数据,所以我们要将其转化到裁剪空间中以便实现正确渲染,如果不对其转换就会得到如下图的异常,这并不满足想要的效果。

Unity Shader 入门笔记(二),图形学,unity,笔记,游戏引擎

2. 顶点着色器和片元着色器通信

上面讲述了顶点着色器的数据是如何来的,并对模型顶点空间的值进行了转换,现在了解顶点着色器和片元着色器是如何通信,还是老规矩上代码:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "My Shader/SimpleShader02"
{
    Properties{
        _Color ("Color Tint", Color) = (1.0, 1.0, 1.0, 1.0)
    }

    SubShader
    {
        Pass{
            CGPROGRAM
            //声明顶点着色函数 vert是顶点着色函数名字
            #pragma vertex vert
            //声明片元着色函数 frag是片元着色函数名字
            #pragma fragment frag
            
            //在CG代码中,需要定义一个属性名称都和类型匹配的变量
            fixed4 _Color;

            //顶点着色器的输入
            struct a2v {
                float4 vertex : POSITION; //用模型空间顶点填充vertex变量
                float3 normal : NORMAL;   //用模型空间法线填充normal变量
                float4 texcoord : TEXCOORD0; //用模型空间第一套纹理坐标填充texcoord变量
            };

            //顶点着色器的输出 --> 输出到片元着色器
            struct v2f{
                float4 pos : SV_POSITION;
                fixed3 color : COLOR0;
            };

            // POSITION / SV_POSITION 是 CG/HLSL 的语义
            v2f vert (a2v v)
            {
                v2f o;
                //注意:MVP变换就是将模型空间转化到裁剪空间
                o.pos = UnityObjectToClipPos(v.vertex);
                //顶点法线的分量范围在[-1,1]之间
                o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
                return o;
            }

            // SV_Target 是HLSL中的系统语义,
            //它等同于告诉渲染器,将用户输出的颜色存储到一个渲染目标上
            //这里输出到默认的帧缓存上
            fixed4 frag (v2f i) : SV_Target
            {
                fixed3 c = i.color;
                c *= _Color.rgb;
                return fixed4(c,1.0);
            }
            ENDCG
        }
    }
}
2.1. 代码运行效果

Unity Shader 入门笔记(二),图形学,unity,笔记,游戏引擎

2.2. 代码解释
2.2.1. 如何通信

在上面代码中,我们声明了一个结构体v2f,v2f用于在顶点着色器和片元着色器之间传递信息。顶点着色器的输出结构中,必须包含一个变量,它的语义是SV_POSITION。否则渲染器就无法得到裁剪空间中的顶点坐标,也就不能把顶点渲染到屏幕上。

顶点着色器是逐顶点调用的,而片元着色器是着片元调用的。片元着色器中的输入实际上是把顶点着色器的输出进行插值后得到的结果

2.2.2. Properties语义块

在上面的代码中我们使用了Properties语义块,在上述代码中声明了一个属性_Color,它的类型是Color。为了在CG代码中可以访问它,我们还需要在CG代码中提前定义一个新的变量,这个变量的名称和类型必须与Properties语义块中的属性定义相匹配

以下是ShaderLab属性类型和CG变量类型的匹配关系:

ShaderLab属性类型

CG变量类型

Color,Vector

float4,half4,fixed4

Range,Float

float,half,fixed

2D

sampler2D

Cube

samplerCube

3D

sampler3D

2.2.3. 关于uniform
uniform fixed4 _Color;

uniform 关键词是CG中修饰变量和参数的一种修饰词,它仅仅用于提供一些关于该变量的初始值是如何指定和存储相关信息。

3. 总结

在这篇文章中我们学习了Shader版本的"Hello World",了解了关于Unity Shader中顶点着色器和片元着色器如何通信和渲染,下一篇文章中我们将继续学习和了解Unity的语义和内置文件,并了解Unity Shader中一些常用的Debug工具。

最后,非常感谢您能看到这里,如果该文章对你有所帮助和启发,也欢迎您能点赞👍支持,如果有任何疑问和优化建议也非常欢迎各位大佬能够在评论区友好交流,一起学习进步。文章来源地址https://www.toymoban.com/news/detail-813978.html

到了这里,关于Unity Shader 入门笔记(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(51)
  • 【UnityShader入门精要学习笔记】第三章(1)Unity Shader介绍

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 从本章节开始我们要学习Shader相关的知识了,诸位看客可能有的

    2024年02月02日
    浏览(49)
  • 【UnityShader入门精要学习笔记】第三章(2)Unity Shader的形式,章节答疑

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (该系列笔记中大多数都会复习前文的知识,特别是前文知识非

    2024年02月02日
    浏览(39)
  • Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(102)
  • (五·二)计算机图形学 之 Unity代码调用Shader并修改属性值

    直接划重点: 在C#代码中,要先引用材质球(Material),然后通过材质球提供的方法比如: 我这里使用material.SetColor(\\\"_Color\\\", Color.red); 结构是SetColor(shader属性名称,属性值设置); _Color是在shader中,Properties{}里定义好的属性,名称要一直,然后就是给他赋值。 Shader代码: C#代码

    2024年02月15日
    浏览(29)
  • Unity Shader入门精要 第六章——Unity中的基础光照

    目录 一、标准光照模型(Phong光照模型) 1、环境光  2、自发光 3、漫反射 4、高光反射 (1)Phong模型 (2)Blinn模型 5、光照模型实现方法——逐顶点和逐像素 二、Unity Shader 漫反射光照模型的实现 1、实践:逐顶点 2、实践:逐像素 3、半兰伯特模型 4、漫反射光照模型效果展

    2024年02月04日
    浏览(40)
  • Unity_Shader入门详解

    在Unity中创建Shader,有Stander Shader、Unlit Shader、Image Effect Shader、Compute Shader、Ray Tracing Shader Stander Shader :Unity内置的标准着色器,支持高光、透明度、法线贴图等特性,比如金属,塑料,木材,皮肤,也支持光照、阴影、反射、折射、透明雾化等... Unlit Shader :不受光照影响的着

    2024年02月10日
    浏览(31)
  • 2023-08-22 Unity Shader 开发入门2 —— Shader 开发介绍

    ​ 计算机图形程序接口(Graphics API)是一套可编程的开放标准,不论 2D 还是 3D 游戏都需要这部分的底层 API 支持。 ​ 它本质上是软件,并不是硬件,是前人提前写好的调用系统硬件(GPU)绘制图形的代码。可以简单理解成是显卡厂商定义的一系列的底层的进行图形操作的加

    2024年02月11日
    浏览(26)
  • Unity Shader 入门(零基础到敢上手敲Shader)

    目录  创建Shader 一.Standard Surface Shader 二.Unlit Shader 三.Image Effect Shader 四.Compute Shader 五.Ray Tracing Shader 着色器语言 Shader默认代码格式和一些常用API讲解 标准表面着色器,它是一种基于物理的着色系统,可以理解为 它是通过对物理现象的简单模拟,可以实现生活中各种物品的效

    2024年02月04日
    浏览(31)
  • 1.Unity之Shader新手入门

    Unity Shader着色器的基本概念 如何使用Unity Shader着色器 示例:如何使用Unity Shader着色器创建复杂的效果 总结 什么是Unity中的Shader着色器? Shader着色器是用来控制物体外观的编程代码,它可以改变物体的颜色、纹理、光照、凹凸等,以及实现各种复杂的效果。Unity中有很多种类

    2024年02月04日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包