在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中設置不同的標記變量,最後一起做返回。不知到以後還會出現什麼坑爹的問題~~苦笑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章