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

本文详细介绍了在Unity中使用OpenGL着色语言(GLSL)编写着色器的方法,包括GLSL着色器程序的基本结构、如何区分顶点和片段程序、以及如何在GLSL中使用外部纹理。此外,还提供了关于Unity如何处理和优化GLSL代码的见解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录: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 程序代码段写在 GLSLPROGRAMENDGLSL 之间。

在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_Vertexgl_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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值