歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 在Android 的openGL ES 2.0中向shader中傳struct

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

日期:2017/2/28 15:44:47   编辑:Linux教程

沒想到openGL ES 2.0和1.x之間的差別那麼大,而市面上介紹2.0的資料又很少。

說說問題:怎麼向shader中的struct傳數據?

直接說答案:struct不提供一次全部賦值的方法,只能一個一個數據傳入。

比如:

  1. struct Blur{
  2. int a;
  3. float b;
  4. }
  5. uniform Blur blur;

那麼就需要向

blur.a和blur.b中一個一個賦值數據。

  1. GLES20.glUniform1i(GLES20.glGetUniformLocation(mProgram,"blur.a"),123);
  2. 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:

  1. int th1 = GLES20.glGetUniformLocation(mProgram, "pic1");
  2. GLES20.glUniform1i(th1,0);
  3. int th2 = GLES20.glGetUniformLocation(mProgram, "pic2");
  4. GLES20.glUniform1i(th2,1);
Copyright © Linux教程網 All Rights Reserved