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