Shader开发之三大着色器

2023-11-03

固定功能管线着色器Fixed Function Shaders

固定功能管线着色器的关键代码一般都在Pass的材质设置Material{}和纹理设置SetTexture{}部分。

Shader "Custom/VertexList" {

    Properties {

        _Color("Main Color",Color) = (0,1,1,0.5)

        _SpecColor("Spec Color",Color) = (1,1,1,1)

        _Emission("Emissive Color",Color) = (0,0,0,0)

        _Shininess("Shininess",Range(0.01,1)) = 0.7

        _MainTex ("Base (RGB)", 2D) = "white" {}

    }

    SubShader {

        Pass{

       

                Material{

                   Diffuse[_Color]

                   Ambient[_Color]

                   Shininess[_Shininess]

                   Specular[_SpecColor]

                   Emission[_Emission]

                }      

                Lighting On

                SeparateSpecular On//启用高光颜色

                //设置纹理

                SetTexture[_MainTex]{

                   //设置颜色常量

                   constantColor[_Color]

                   //混合命令

                   combine texture * primary DOUBLE,

                   texture *constant

                }

            }

    }

}

 

表面着色器Surface Shaders

在Unity中,表面着色器的关键代码用Cg/HLSL语言编写,然后嵌在ShaderLab的结构代码中使用。使用表面着色器,用户仅需要编写最关键的表面函数,其余周边代码将由Unity自动生成,包括适配各种光源类型、渲染实时阴影以及集成到前向/延迟渲染管线中等。

编写表面着色器有几个规则:

1)表面着色器的实现代码需要放在CGPROGRAM..ENDCG代码块中,而不是Pass结构中,它会自己编译到各个Pass。

2)使用#pragma surface..命令来指明它是一个表面着色器。

#pragma surface 表面函数光照模型[可选参数]

其中表面函数用来说明哪个Cg函数包含有表面着色器代码,表面函数的形式为:

void surf(Input IN,inoutSurfaceOutPut 0)

光照模型可以是内置的Lambert和BlinnPhong,或者是自定义的光照模型。

表面函数的作用是接收输入的UV或者附加数据,然后进行处理,最后将结构填充到输出结构体SurfaceOutPut中。

输入结构体Input一般包含着色器所需的纹理坐标,纹理坐标的命名规则为uv加纹理名称。另外还可以在输入结构中设置一些附加数据:

 

SurfaceOut描述了表面的各种参数,它的标准结构为:

  

struct SurfaceOutput{
    half3 Albedo;//反射光
    half3 Normal;//法线
    half3 Emission;//自发光
    half Specular;//高光
    half Gloss;//光泽度
    half Alpha;//透明度
};

 

将输入数据处理完毕后,将结果填充到输出结构体中。

 

相关示例:

1、使用内置的Lambert光照模型,并设置表面颜色为白色。

 1 Shader "Custom/Diffuse Simple" {
 2 
 3     SubShader{
 4 
 5         Tags{"RenderType" = "Opaque"}
 6 
 7         CGPROGRAM//表面着色器的实现代码
 8 
 9         //指明着色器类型,表面函数和光照模型
10 
11         #pragma surface surf Lambert
12 
13        
14 
15         struct Input{//输入的数据结构体
16 
17             float color : COLOR;
18 
19         };
20 
21        
22 
23         void surf(Input IN,inoutSurfaceOutput o){//表面函数
24 
25             o.Albedo = 1;//输出颜色值
26 
27         }
28 
29         ENDCG;
30 
31    
32 
33     }
34 
35     Fallback "Diffuse"//备选着色器
36 
37 }

 

渲染效果如下:

 

2、在示例1的基础上添加纹理,代码如下:

 1 Shader "Custom/Diffuse Simple" {
 2 
 3  
 4 
 5     Properties{//添加纹理属性
 6 
 7         _MainTex("Texture",2D) = "White"{}
 8 
 9    
10 
11     }
12 
13     SubShader{
14 
15         Tags{"RenderType" = "Opaque"}
16 
17         CGPROGRAM   //表面着色器的实现代码
18 
19         //指明着色器类型,表面函数和光照模型
20 
21         #pragma surface surf Lambert
22 
23        
24 
25         struct Input{//输入的数据结构体
26 
27             float2 uv_MainTex;
28 
29         };
30 
31        
32 
33         sampler2D _MainTex;
34 
35        
36 
37         void surf(Input IN,inout SurfaceOutput o){//表面函数
38 
39             o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;
40 
41         }
42 
43         ENDCG
44 
45    
46 
47     }
48 
49     Fallback "Diffuse"//备选着色器
50 
51 }

 

渲染效果如下:

 

3、在示例2的基础上添加法线贴图

 1 Shader "Custom/Diffuse Simple"{
 2 
 3     Properties{//添加纹理属性
 4 
 5         _MainTex("Texture",2D) = "white"{}
 6 
 7         //添加法线贴图属性
 8 
 9         _BumpMap("Bumpmap",2d) = "bump"
10 
11     }
12 
13     SubShader{
14 
15         Tags{"RenderType" = "Opaque"}
16 
17         CGPROGRAM//表面着色器的实现代码
18 
19         //指明着色器类型,表面函数和光照模型
20 
21         #pragma surface surf Lambert
22 
23         struct Input{//输入的数据结构体
24 
25             float2 uv_MainTex;
26 
27             float2 uv_BumpMap;
28 
29         };
30 
31         sampler2D _MainTex;
32 
33         sampler2D _BumpMap;
34 
35         void surf(Input IN,inout SurfaceOutput o){//表面函数
36 
37             o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;
38 
39             o.Normal = UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));
40 
41         }
42 
43         ENDCG
44 
45     }
46 
47     Fallback "Diffuse"//备选着色器
48 
49 }

 

渲染效果如下:

 

4、添加立方体贴图反射

 1 Shader "Surface Shader Example/Diffuse Simple"{
 2 
 3     Properties{//添加纹理属性
 4 
 5     _MainTex("Texture",2D) = "white"{}
 6 
 7     //立方体贴图属性
 8 
 9     _Cube("Cubemap",CUBE) = ""{}
10 
11 }
12 
13     SubShader{
14 
15             Tags{"RenderType" = "Opaque"}
16 
17             CGPROGRAM//表面着色器的实现代码
18 
19             //指明着色器类型,表面函数和光照模型
20 
21             #pragma surface surf Lambert
22 
23             struct Input{//输入的数据结构体
24 
25                 float2 uv_MainTex;
26 
27                 float3 worldRefl;//输入反射参数
28 
29         };
30 
31             sampler2D _MainTex;
32 
33             SamplerCUBE _Cube;
34 
35             void surf(Input IN,inout SurfaceOutput o){//表面函数
36 
37                 o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;
38 
39                 //将发射颜色设置给自发光颜色
40 
41                 o.Emission = texCUBE(_Cube,IN.worldRefl).rgb;
42 
43             }
44 
45             ENDCG
46 
47     }
48 
49     Fallback "Diffuse"//备选着色器
50 
51 }

 

渲染效果如下:

 

顶点片段着色器Vertex And Fragment Shaders

顶点片段着色器运行于具有可编程渲染管线的硬件上,它包括顶点程序Vertex Programs和片段程序Fragment Programs。当在使用顶点程序或片段程序进行渲染的时候,图形硬件的固定功能管线会关闭,具体来说就是编写的顶点程序会替换掉固定管线中标准的3D变换,光照,纹理坐标生成等功能,而片段程序会替换掉SetTexture命令中的纹理混合模式。因此编写顶点片段着色器需要对3D变化,光照计算等有非常透彻的了解,需要写代码来替代D3D或者OpenGL原先在固定功能管线中要做的工作。

 与表面着色器一样,顶点片段着色器也需要用Cg/HLSL来编写核心的实现代码,代码用CGPROGRAM ENDCG语句包围起来,放在ShaderLab的Pass命令中,形式如下:

Pass{
//通道设置
CGPROGRAM
//本段Cg代码的编译命令
#pragma vertexvert
#pragma fragment frag
//Cg代码
ENDCG
//其他通道设置
}

 

顶点着色程序从GPU前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送光栅操作模块。

顶点着色器和像素着色器的数据处理流程

 

在应用程序中设定的图元信息(顶点位置坐标、颜色、纹理坐标等)传递到vertex buffer中;纹理信息传递到texture buffer中。其中虚线表示目前还没有实现的数据传递。当前的顶点程序还不能处理纹理信息,纹理信息只能在片断程序中读入。

顶点着色程序与片断着色程序通常是同时存在,相互配合,前者的输出作为后者的输入。不过,也可以只有顶点着色程序。如果只有顶点着色程序,那么只对输入的顶点进行操作,而顶点内部的点则按照硬件默认的方式自动插值。例如,输入一个三角面片,顶点着色程序对其进行phong光照计算,只计算三个顶点的光照颜色,而三角面片内部点的颜色按照硬件默认的算法(Gourand明暗处理或者快速phong明暗处理)进行插值,如果图形硬件比较先进,默认的处理算法较好(快速phong明暗处理),则效果也会较好;如果图形硬件使用Gourand明暗处理算法,则会出现马赫带效应(条带化)。

而片断着色程序是对每个片断进行独立的颜色计算,并且算法由自己编写,不但可控性好,而且可以达到更好的效果。

由于GPU对数据进行并行处理,所以每个数据都会执行一次shader程序程序。即,每个顶点数据都会执行一次顶点程序;每个片段都会执行一次片段程序。

片段就是所有三维顶点在光栅化之后的数据集合,这些数据没有经过深度值比较,而屏幕显示的像素是经过深度比较的。

 

顶点片段着色器中编译命令的一些说明:

编译命令Compilation directive

 

编译目标Shader targets

 

下面是一些顶点片段着色器的例子:

1)根据发现方向设置模型表面颜色

 1 Shader"Tutorial/Display Normals"{
 2 
 3     SubShader{
 4 
 5         Pass{
 6 
 7             CGPROGRAM
 8 
 9             //CG代码块开始
10 
11             #pragma vertex vert
12 
13             #pragma fragment frag
14 
15             #include "UnityCG.cginc"
16 
17             struct v2f{
18 
19                 float4 pos:SV_POSITION;
20 
21                 float3 color:COLOR0;
22 
23             };
24 
25                v2f vert(appdata_base v)
26 
27                {//顶点程序代码,计算位置和颜色
28 
29                   v2f o;
30 
31                   o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
32 
33                   o.color = v.normal*0.5+0.5;
34 
35                   return o;
36 
37                }
38 
39               half4 frag(v2f i):COLOR
40 
41              {
42 
43                  //片段程序代码,直接把输入的颜色返回,并把透明度设置为1
44 
45                    return half(i.color,1);
46 
47              }
48 
49             ENDCG
50 
51         }
52 
53     }
54 
55     Fallback "VertexLit"
56 
57 }

 

渲染效果如下:

 

2)根据切线方向设置模型表面颜色。

 

 1 Shader"vertex and fragment example/Tangents"{
 2 
 3     SubShader{
 4 
 5         Pass{
 6 
 7             Fog{Mode Off}
 8             CGPROGRAM
 9 
10             //CG代码块开始
11 
12             #pragma vertex vert
13 
14             #pragma fragment frag
15 
16             //输入位置和切线数据
17 
18             struct appdata{
19 
20                 float4 vertex : POSITION;
21 
22                 float4 tangent : TANGENT;
23 
24             };
25             
26             struct v2f{
27                 float4 pos : POSITION;
28                 fixed4 color : COLOR;
29             
30             };
31                v2f vert(appdata_base v)
32 
33                {//顶点程序代码,计算位置和颜色
34 
35                   v2f o;
36 
37                   o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
38 
39                   o.color = v.tangent*0.5+0.5;
40 
41                   return o;
42 
43                }
44                
45               fixed4 frag(v2f i):COLOR0
46               {
47 
48                  //片段程序代码,直接把输入的颜色返回,并把透明度设置为1
49 
50                     return i.color;
51 
52               }
53 
54              ENDCG
55 
56         }
57 
58     }
59 
60 }

 

 

渲染效果如下:

 

posted on 2015-09-06 14:40  RunningSnail 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/tgycoder/p/4785553.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shader开发之三大着色器 的相关文章

  • jquery的contains如何实现精准匹配

    HTML结构
  • vue的组件

    在Vue中 组件是可复用的代码块 用于构建用户界面 Vue的组件系统允许您将界面拆分为独立的 可重复使用的部件 提供了更好的代码组织和复用性 以下是在Vue中创建组件的基本步骤 创建一个组件实例 可以使用Vue extend 方法创建一个V
  • 游戏被攻击了要怎么办

    有客户反馈刚上线新款游戏 没两天就被攻击了 导致用户无法登录 来咨询到我们这边能不能帮他解决 今天就来分享下 怎么预防游戏攻击和已经被攻击的游戏服务器该怎么处理 服务器不管是个人还是企业 被攻击的都有 在所难免 特别是新上线时候要承受住外来
  • CTF之逆向入门

    逆向工程 Reverse Engineering 又称反向工程 是一种技术过程 即对一项目标产品进行逆向分析及研究 从而演绎并得出该产品的处理流程 组织结构 功能性能规格等设计要素 以制作出功能相近 但又不完全一样的产品 逆向工程源于商业及
  • 基于java的扫雷游戏系统设计与实现

    基于java的扫雷游戏系统设计与实现 I 引言 A 研究背景和动机 扫雷游戏是一种经典的益智游戏 由于其简单易学 规则简单 玩法多样等特点 深受广大游戏爱好者的喜爱 但是 现有的扫雷游戏系统往往存在着游戏难度不均衡 游戏时间过长 游戏规则不
  • 【连续和自适应资源需求估计】通过不断应用在线优化、选择和估计,SARDE能够有效地适应在线跟踪,并使用得到的集成技术减少模型误差(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据 文章
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • Android SDK开发艺术探索(五)安全与校验

    一 前言 本篇是Android SDK开发艺术探索系列的第五篇文章 介绍了一些SDK开发中安全方面的知识 包括资源完整性 存储安全 权限校验 传输安全 代码混淆等知识 通过基础的安全配置为SDK保驾护航 探索SDK开发在安全方面的最佳实践
  • 基于java的web仓库管理系统设计与实现

    基于java的web仓库管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的Web仓库管理系统是近年来快速发展的领域之一 它提供了丰富的功能 如数据存储 数据检索 数据分析和数据可视化等 本文将重点介绍基于Java的Web仓库管
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 低代码-添加按钮组件设计

    效果图 可拆分为以下细节 按钮列表 删除 两个操作需同步删除 点击外侧删除 点击复选框删除 添加 点击复选框添加 示例代码 技术栈 vue3 arco design ts less tailwindcss
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 每天10个前端小知识 <Day 14>

    前端面试基础知识题 1 CSSOM树和DOM树是同时解析的吗 浏览器会下载HTML解析页面生成DOM树 遇到CSS标签就开始解析CSS 这个过程不会阻塞 但是如果遇到了JS脚本 此时假如CSSOM还没有构建完 需要等待CSSOM构建完 再去
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升
  • 深入解析 YAML 配置文件:从语法到最佳实践

    一 认识YAML YAML YAML Ain t Markup Language 是一种人类可读的数据序列化语言 它的设计目标是使数据在不同编程语言之间交换和共享变得简单 YAML采用了一种简洁 直观的语法 以易于阅读和编写的方式表示数据结
  • 【前端】canvas图片加文字

    注释标记了操作步骤 import React Component createRef from react class CertifyImgRender extends Component bgRef createRef

随机推荐

  • E4和C++ 开发-Unity 过度到 Unreal 4 对比参考详细

    1 两个编辑器的布局如下 1 1 unity 1 2 UE4 2 Editing Assets编辑资源 2 1 Detail面板就是负责编辑工程资源 类似于Unity里面的Inspector 3 两个引擎的部分术语对比 4 Projects
  • miui秒解bl锁_MIUI12解锁bl篇(原谅我的过失,接上篇文章)

    求原谅 真心求原谅 由于我的疏忽 上期教程不完整 对大家造成不便在这里给大家真诚道歉 对不起 请收下我的膝盖 我的上个教程 小米手机MIUI系统降级任意版本通用教程 MIUI12 MIUI9 因为需要接受bl才可以顺利使用miflash刷机
  • objective c 字符串各种处理

    关于字符串的各种操作 总结一下以便以后复习查找 内容简要 1 创建常量字符串 2 创建空字符串 给予赋值 3 在以上方法中 提升速度 initWithString方法 4 用标准c创建字符串 initWithCString方法 5 创建格式
  • 系统架构设计师之系统设计-面向对象设计-设计模式的分类

    系统架构设计师之系统设计 面向对象设计 设计模式的分类
  • unity学习之URP多相机以及多通道渲染

    默认已经创建好一个URP工程 不知道怎么创建可以看这里 摄像机堆叠 摄像机堆叠允许将多个摄像机的结果合成在一起 摄像机堆叠由一个基础 Base 摄像机和任意数量的额外叠加 Overlay 摄像机组成 当摄像机堆叠中的多个摄像机渲染到同一个渲
  • 16进制颜色代码

    16 进制颜色代码 16 进制颜色代码颜色的组成方式 16进制代码 前二位代表R值 中间二位代表G 末二位代表B 即前两位表示红色 中间两位表示绿色 最后两位表示蓝色 以0 1 2 3 4 5 6 7 8 9 A B C D E F共16位
  • 高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

    文章目录 toc 1 工程目录创建 2 新建工程 3 设计输入 4 设计仿真 5 综合 6 管脚分配 7 时钟约束 8 比特流文件生成 9 程序下载 10 程序固化 11 总结 12 工程下载 本文是高云FPGA系列教程的第2篇文章 介绍完
  • 产业大数据应用:洞察区域产业实况,把握区域经济脉搏

    随着新一代信息技术的崛起 我们进入了大数据时代 在这个时代 数据作为基本生产要素不仅改变着我们的日常生活 更是在区域产业经济发展中扮演着重要角色 它赋予了政府 企业和投资者敏锐的洞察力 一 摸清区域经济现状 基于区域产业经济数据的收集及导入
  • Halcon-表面检测-----裂纹检测

    对应示例程序 detect mura defects blur hdev 目标 实例实现LCD上有很多污点干扰下 检测LCD的印痕检测 思路为 对LCD图像进行拆分 提取RGB三个分量 对B分量进行处理 将其转换为频域内图像 并对其进行高斯
  • 数据分析行业,主要有哪些基本职位,具体的职责是什么?

    1 数据跟踪员 机械拷贝看到的数据 很少处理数据 虽然这个工作的人还不能称作数据分析师 但是往往作这样工作的人还都自称是数据分析师 这样的人 只能通过 系统看到有限的数据 并且很少去处理数据 甚至不理解数据的由来和含义 只是机械的把自己看到
  • 21届毕业生,想做软件测试,没工作经验而且已经毕业,怎么找软件测试工作?

    如果说你是上面现状去找软件测试工作 而且居然还找到了 那么可能会是如下几种情况 1 该公司对软件质量要求很低 随便来个会点点点的 能够检查功能是否正常即可 毕竟我是真遇到过一个CEO说 软件测试很难吗 我都能测试啊 没必要找测试人员 开发完
  • 不对等的爱情该不该放弃

    刚好两个人对爱情都有勇气全力以赴是多么难得的巧合 每个人都有自己的过往 我期望我们在最适当的时候相遇 一个投入的人碰上一个疏离的人 结局必定黯然 下一次 我希望我们相遇的时间会好一点 爱情经常出现一种奇怪的模式 你很用力的去爱一个人 对方却
  • jmeter JDBC request提示“Cannot convert value '0000-00-00 00:00:00' from column 6 to TIMESTAMP.”

    在学习jmeter数据库相关的过程中 在请求数据库时报错 Cannot convert value 0000 00 00 00 00 00 from column 6 to TIMESTAMP 解决方法 更改连接数据库方式 在连接 jdbc
  • C++基础入门教程

    1 C 初识 1 1 第一个C 程序 编写一个C 程序总共分为4个步骤 创建项目 创建文件 编写代码 运行程序 1 1 1 创建项目 Visual Studio是我们用来编写C 程序的主要工具 我们先将它打开 1 1 2 创建文件 右键源文
  • 获取本地硬盘信息

    using System using System Runtime InteropServices using System Text namespace driverId Serializable public struct HardDi
  • JS-语法进阶

    JS 语法进阶 三元运算符 类数组对象
  • 蓝桥杯 51单片机 AT24C02

    工作电压为1 8v 6v 第7引脚 WP 接地时允许正常读写 24C02设备地址包括固定部分和可编程部分 编程部分由A2 A1 A0三个硬件引脚来控制 设备地址最后一位用于设置数据传输方向 读 写 在IIC总线协议中 设备地址是起始信号后第
  • git分支管理策略

    1 总览 git 的分支整体预览图如下 从上图可以看到主要包含下面几个分支 master git默认主分支 这里不作操作 stable 稳定分支 替代master 主要用来版本发布 develop 日常开发分支 该分支正常保存了开发的最新代
  • 黑客自学路线

    谈起黑客 可能各位都会想到 盗号 其实不尽然 黑客是一群喜爱研究技术的群体 在黑客圈中 一般分为三大圈 娱乐圈 技术圈 职业圈 娱乐圈 主要是初中生和高中生较多 玩网恋 人气 空间 建站收徒玩赚钱 技术高的也是有的 只是很少见 技术圈 这个
  • Shader开发之三大着色器

    Shader开发之三大着色器 固定功能管线着色器Fixed Function Shaders 固定功能管线着色器的关键代码一般都在Pass的材质设置Material 和纹理设置SetTexture 部分 Shader Custom Vert