Unity3D环境下的GLSL shaders写法

GLSL shaders对Mac, iOS和Android平台非常有用.。这篇文章的目的就是告诉大家如何在Unity3D中最小限度地写GLSL shader。在这篇文章中我会展示一个在Unity3D写GLSL shaders的模版,另外还有帮助文档。


GLSL ES 2.0支持两种类型的shader: 顶点着色器(Vertex)和片段着色器(Fragment)。其他类型的着色器都不支持(例如:几何着色器)。顶点着色器会获取到一些输入数据(稍后会详细介绍),而且必须输出的数据中至少要包括gl_Position变量。一个最小限度的顶点着色器代码是这样的:

void main()
{
    //在屏幕坐标系中每一个顶点的坐标都将被计算出来( = gl_Position)
    //通过做乘积运算,将被乘数顶点在世界坐标系的坐标( = gl_Vertex)
    //和乘数MVP矩阵( = gl_ModelViewProjectionMatrix)
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

片段着色器也会获取到一些输入数据,而且必须输出的数据中至少要包括gl_FragColor变量。一个最小限度的片段着色器代码是这样的:

void main()
{
    //将对象在屏幕中显示的每个像素值都改成红色的
    gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0);
}

想要在Unity shader中运用上面的的GLSL shader代码,那模版的样子就是这样的:

Shader "Shader name"
{    
        Properties
        {        
             //添加任何变量
        }
          SubShader
          {
                 Tags { "Queue" = "Geometry" }
                 Pass
                  {            
                     GLSLPROGRAM                          
                     #ifdef VERTEX            
                         //在这里添加顶点着色器代码
                     #endif  

                     #ifdef FRAGMENT
                         //在这里添加片段着色器代码
                     #endif                          
                     ENDGLSL        
                   }
           }
}

一个简单的将对象渲染成红色的shader代码:

Shader "simple_Red_Shader"
{    
    Properties
    {        
                
    }
    SubShader
    {
        Tags { "Queue" = "Geometry" }
        Pass
            {            
                GLSLPROGRAM                          
                #ifdef VERTEX  
                void main()
                {          
                   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
                }
                #endif  
            
                #ifdef FRAGMENT
                void main()
                {          
                   gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0);
                }
                #endif                          
                ENDGLSL        
            }
     }
}

在接下来的文章里,我会展示如何通过Unity脚本创建并访问shader的参数(也就是color, texture等等)和通过UnityCG.glslinc访问Unity内建对象。

帮助文档

原文地址

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值