红联Linux门户
Linux帮助

在Android的openGL ES 2.0中向shader中传struct

发布时间:2014-10-11 09:31:48来源:linux网站作者:jiaoyang623

没想到openGL ES 2.0和1.x之间的差别那么大,而市面上介绍2.0的资料又很少。

说说问题:怎么向shader中的struct传数据?


直接说答案:struct不提供一次全部赋值的方法,只能一个一个数据传入。

比如:

struct Blur{ 
int a; 
float b; 

uniform Blur blur;

那么就需要向

blur.a和blur.b中一个一个赋值数据。

GLES20.glUniform1i(GLES20.glGetUniformLocation(mProgram,"blur.a"),123); 
GLES20.glUniform1f(GLES20.glGetUniformLocation(mProgram,"blur.b"),123.456);


还有一件事,本以为GLSL的语法在Android和iOS上都一样,结果,有差别:

在iOS中变量名和方法名可以共用,在android中不可以共用。否在在useProgram的时候会报invalidate_operation的错误。

多么坑爹的差别啊!


关于错误码,咱上网搜了很久错误码都没找到代表什么意思。结果很SB,错误码写在了GLES20的常量中。如果你能看到源代码,他们还被写在了一起。

再补充一条,关于图像加载。


原以为加载完图像了会自动分配到sampler2D上,结果不是这样的,需要自己给sampler2D分配编号:

fragmentShader:

uniform sampler2D pic1;
uniform sampler2D pic2;

如果不分配编号的话,加载的就都是一个图像,苦逼。

java:

int th1 = GLES20.glGetUniformLocation(mProgram, "pic1"); 
GLES20.glUniform1i(th1,0); 
int th2 = GLES20.glGetUniformLocation(mProgram, "pic2"); 
GLES20.glUniform1i(th2,1);