android glsl,技术分享

之前在做后台渲染引擎的编译时,尝试将一个GLSL version 110的版本写成GLSL version 330的,在此将学习过程和收获记录下来。

介绍

你可以使用#version命令作为着色器的第一行来指定GLSL版本:

version120

voidmain(){

gl_FragColor=vec4(1.0);

}

GLSL版本与GL版本一起发布。 请参阅以下图表以确定要定位的版本。

GLSL版本

d5531bbb7aa5e341223ef5f10cbd6e49.png

GLSL ES版本 (Android, iOS, WebGL)

OpenGL ES有自己的着色语言,而且版本开始变得新鲜。它是基于OpenGL着色语言版本1.10。

2d13e0e936311409be292872144e15d9.png

所以,例如,如果GLSL 120中有一个功能,它可能在GLSL ES 100中不可用,除非ES编译器特别允许它。

一些差异

(桌面)GLSL版本之间的差异。

版本 100

定点着色器:

uniform mat4 projTrans;

attribute vec2Position;

attribute vec2TexCoord;

varying vec2 vTexCoord;

voidmain(){

vTexCoord=TexCoord;

gl_Position=u_projView*vec4(Position,0.0,1.0);

}

片段(片元)着色器:

uniform sampler2D tex0;

varying vec2 vTexCoord;

voidmain(){

vec4 color=texture2D(tex0,vTexCoord);

gl_FragColor=color;

}

版本 330

从GLSL 130+开始,使用in和out代替属性和变化。 GLSL 330+包括其他功能,如布局限定符和将texture2D更改为纹理。

顶点着色器

#version 330

uniform mat4 projTrans;

layout(location=0)in vec2Position;

layout(location=1)in vec2TexCoord;

out vec2 vTexCoord;

voidmain(){

vTexCoord=TexCoord;

gl_Position=u_projView*vec4(Position,0,1);

}

片段(片元)着色器:

#version 330

uniform sampler2D tex0;

in vec2 vTexCoord;

//使用你自己的输出从而替代 gl_FragColor

out vec4 fragColor;

voidmain(){

//'texture' 替代 'texture2D'

fragColor=texture(tex0,vTexCoord);

}

其他重大的变化

GLSL 120 增加

1,你可以在着色器中初始化数组,如下所示:

floata[5]=float[5](3.4,4.2,5.0,5.2,1.1);

floatb[5]=float[](3.4,4.2,5.0,5.2,1.1);

然而,即使使用GLSL 120,Mac OSX Snow Leopard也不支持上述功能。

2,你可以在着色器中初始化全局变量,并且值将在链接时设置:

uniformfloatval=1.0;

3,在设置const值时,可以使用像sin()这样的内置函数;

4,必要时,整数会隐式转换为浮点数,例如:

floatf=1.0;

floatg=1;

vec2 v=vec2(1,2.0);

5,你可以用f来定义一个浮点数:float f = 2.5f。

GLSL 130 增加

1,支持int和uint(以及它们的按位操作);

2,支持switch语句;

3,新的内置函数:trunc(),round(),roundEven(),isnan(),isinf(),modf();

4,片段输出可以是用户定义的;

5,输入和输出用in和out语法声明,替代属性和变化。

GLSL 150 增加

1,现在应该使用texture(),替代texture2D()。

GLSL330 增加

1,布局限定符可以声明顶点着色器输入和片段着色器输出的位置,例如:

layout(location = 2) in vec3 values[4];

形式上这只能通过ARB_explicit_attrib_location扩展来实现。

注意

1,uniform在图形学中可以理解为全局变量,如果varying修饰的跟cg一样都是函数参数,会很好理解;

2,片段和片元其实都指的是一个fragment;

3,vertex和point两个意思有时候不一样,前一个指定点、端点,后一个指“单纯的一个”点。

上传的附件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值