【Unity Shader】GLSL

GLSL版本

在这里插入图片描述
可以参考下面的版本介绍
https://registry.khronos.org/OpenGL/specs/gl/

修饰符版本变化

1.varying
片段着色器的输入或顶点着色器的输出。(GLSL 1.30 (OpenGL 3.0)废弃,GLSL 1.40及以上移除), 当然webgl中还是使用这个老版本
新版本中对应使用的的是in/out

在GLSL中用in修饰的变量表示传入的数据,用out修饰的变量表示传出的数据,通过这样可以实现顶点着色器向片段着色器传递数据,但要注意这个变量的命名要相同,不相同的话,片段着色器是获取不到从顶点着色器传入的数据的。

顶点着色器

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
 
out vec3 ourColor;
out vec2 texCoord;  // 从顶点着色器中传出数据

片段着色器

#version 330 core
out vec4 FragColor;
 
in vec3 ourColor;
in vec2 TexCoord;  // 和顶点着色器中传出的变量的命名不同,因此他的值为0

GLSL 中纹理坐标问题

GLSL中纹理坐标Y方向的原点在顶部,而HLSL中纹理坐标Y方向的原点在底部,所以你需要使用这个公式uv.y = 1 – uv.y 对每个点重新定义纹理坐标

函数参数限定符

GLSL 允许自定义函数,但参数默认是以值形式(in 限定符)传入的,也就是说任何变量在传入时都会被拷贝一份,若想以引用方式传参,需要增加函数参数限定符。

in 用在函数的参数中,表示这个参数是输入的,在函数中改变这个值,并不会影响对调用的函数产生副作用。(相当于C语言的传值),这个是函数参数默认的修饰符
out 用在函数的参数中,表示该参数是输出参数,值是会改变的。
inout 用在函数的参数,表示这个参数即是输入参数也是输出参数。

内置变量

下面部分可能由于版本迭代已经被删减了
顶点着色器可用的内置变量

名称类型描述
gl_Colorvec4输入属性-表示顶点的主颜色 对应unity中的mesh.color
gl_SecondaryColorvec4输入属性-表示顶点的辅助颜色
gl_Normalvec3输入属性-表示顶点的法线值
gl_Vertexvec4输入属性-表示物体空间的顶点位置 对应unity中的mesh.vertices
gl_MultiTexCoordnvec4输入属性-表示顶点的第n个纹理的坐标,这个对应unity的mesh.uvn
gl_FogCoordfloat输入属性-表示顶点的雾坐标
gl_Positionvec4输出属性-变换后的顶点的位置,用于后面的固定的裁剪等操作。所有的顶点着色器都必须写这个值。
gl_ClipVertexvec4输出坐标,用于用户裁剪平面的裁剪
gl_PointSizefloat点的大小
gl_FrontColorvec4正面的主颜色的varying输出
gl_BackColorvec4背面主颜色的varying输出
gl_FrontSecondaryColorvec4正面的辅助颜色的varying输出
gl_BackSecondaryColorvec4背面的辅助颜色的varying输出
gl_TexCoord[]vec4纹理坐标的数组varying输出
gl_FogFragCoordfloat雾坐标的varying输出

片元着色器可用的内置变量

名称类型描述
gl_Colorvec4包含主颜色的插值只读输入
gl_SecondaryColorvec4包含辅助颜色的插值只读输入
gl_TexCoord[]vec4包含纹理坐标数组的插值只读输入
gl_FogFragCoordfloat包含雾坐标的插值只读输入
gl_FragCoordvec4只读输入,窗口的x,y,z和1/w
gl_FrontFacingbool只读输入,如果是窗口正面图元的一部分,则这个值为true
gl_PointCoordvec2点精灵的二维空间坐标范围在(0.0, 0.0)到(1.0, 1.0)之间,仅用于点图元和点精灵开启的情况下。
gl_FragData[]vec4使用glDrawBuffers输出的数据数组。不能与gl_FragColor结合使用。
gl_FragColorvec4输出的颜色用于随后的像素操作
gl_FragDepthfloat输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替

宏定义

关于宏的名字可以任意取,但是不能和两个内置的宏冲突,分别是 GL_ES 和 GL_FRAGMENT_PRECISION_HIGH,GL_ES 在OpenGL ES 2.0 中定义为1,GL_FRAGMENT_PRECISION_HIGH 表示片元着色器支持highp精度
关于精度限定,来看一个例子

#ifdef GL_ES
  #ifdef GL_FRAGMENT_PRECISION_HIGH
    precision highp float; //着色器支持高精度,限定浮点类型为高精度
  #else
    precision mediump float; //着色器不支持高精度,限定浮点类型为中精度	
  #endif
#endif

GLSL ES 还提供了一个#version 指令来指定着色器使用的GLSL ES的版本,如果不指定GLSL ES的版本,默认指定101,如果你要指定为100版本,在着色器的顶部写下 #version 100 语句,
注意, #version指令必须写在着色器顶部,在它之前只能有注释和空白

参考

https://registry.khronos.org/OpenGL/specs/gl/GLSLangSpec.1.20.pdf

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值