在android 的openGL ES 2.0中怎么向shader中传struct

没想到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);

[2012-08-06]

懒得再写新的文。OpenGL的都在这里说吧。要吐槽,绝对得吐。不同的机型对Opengl的支持怎么就这么不一样!

我用自己的One X运行原型程序,结果都正确。然后换到同事的Desire S上,尼马崩了。而且崩在GLSL代码中。好吧,你也知道GLSL拿来debug是很需要一些技巧的。我的方法就是,拿输出图像作为debug的输出。比如当一个bool是真的时候,将结果图像输出为红色,否则就是蓝色。这么折腾来折腾去,发现了坑爹的原因:

某些机型在return之后不能再有代码了。在if判断部分return就会有问题。

这尼马是不是又得回到汇编时代做标记去!结果只能在if-else中设置不同的标记变量,最后一起做返回。不知到以后还会出现什么坑爹的问题~~苦笑

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值