您当前的位置: 首页 >  unity

Jave.Lin

暂无认证

  • 3浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Unity Shader - GLSL Shader programs GLSL 着色器程序

Jave.Lin 发布时间:2019-06-30 22:32:07 ,浏览量:3

目录:Unity Shader - 知识点目录(先占位,后续持续更新) 原文:GLSL Shader programs 版本:2019.1

GLSL Shader programs

GLSL 着色器程序

除了使用Cg/HLSL shader programs(Cg/HLSL着色程序),OpenGL着色语言(GLSL)着色器可以直接编写。

然而,使用原生GLSL的话仅推荐用于测试,或是当你明确知道你的项目最终仅允许与Mac OS X,或是OpenGL ES的移动设备,或是Linux上。正常情况下,Unity会根据发布平台将Cg/HLSL 编译、优化到GLSL。

GLSL snippets

GLSL 程序代码段写在 GLSLPROGRAM 和 ENDGLSL 之间。

在GLSL,所有的shader入口函数都叫 main()。当Unity加载GLSL shader,它会加载一次带有 VERTEX 预处理宏定义的 vertex程序,也会加载一次带有 FRAGMENT 预处理宏定义的 fragment程序。所以在 GLSL 代码中区别 vertex和fragment程序部分的,是使用 #ifdef VERTEX … #endif 和 #ifdef FRAGMENT … #endif 分别括起来的部分。每个 GLSL 代码段必须包含 vertex程序与fragment程序。

标准的include头文件方式与Cg/HLSL shader提供的方式一样;但GLSL的使用:.glslinc 扩展名。

UnityCG.glslinc

顶点着色器输入数据来自预定义的GLSL变量(gl_Vertex,gl_MultiTexCoord0,…)或用户定义的attribute属性。下面是定义仅有tangent切向量attribute:

attribute vec4 Tangent;

从顶点到片段程序的数据是通过varying的变量来传过去的,例如:

varying vec3 lightDir; // vertex shader computes this, fragment shader uses this
External OES textures

Unity在着色器编译过程中做了一些预处理;例如,基于图形API (GlES3, GLCore), texture2D/texture2DProj函数可以替换为texture/textureProj。一些扩展不支持新的约定,最明显的是GL_OES_EGL_image_external。

如果您想在GLSL着色器中采样外部纹理,请使用textureExternal/ textujexternal调用,而不是texture2D/texture2DProj。

例如:

gl_FragData[0] = textureExternal(_MainTex, uv);
关注
打赏
1664331872
查看更多评论
立即登录/注册

微信扫码登录

0.0547s