Android openGL ES上色,创建顶点shader失败

Android openGL ES着色,创建顶点shader失败
最近在学Android上的OpenGL ES,学到着色这一块,除了个问题,一直没有解决:还请大神帮帮忙:
以下是我的代码:
分为四个部分:主界面MainActivity.java、渲染类Renderer(MyRenderer.java)、画正方形的类Rectangle.java、以及一个做shader操作的类ShaderUtil.java

MainActivity.java:
package com.cxy.picturetransfer;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

public class MainActivity extends Activity {

GLSurfaceView glSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
glSurfaceView = new GLSurfaceView(this);
// 设置OpenGLES版本为2.0
glSurfaceView.setEGLContextClientVersion(2);

// 设置渲染器 渲染模式
MyRenderer mRenderer = new MyRenderer(glSurfaceView);
glSurfaceView.setRenderer(mRenderer);
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

setContentView(glSurfaceView);
}

}



MyRenderer.java:
package com.cxy.picturetransfer;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import android.util.Log;

public class MyRenderer implements GLSurfaceView.Renderer {
private Rectangle rect;

//构找函数
public MyRenderer(GLSurfaceView glView){
Log.v("构造函数先执行\n", "");
//创建三角形对象
rect = new Rectangle(glView);
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {//设置屏幕背景色
GLES20.glClearColor(0, 0, 0, 1.0f);
//打开深度检测
GLES20.glEnable(GLES20.GL_DEPTH_TEST);}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
//设置视窗大小及位置
GLES20.glViewport(0, 0, width, height);
//计算GLSurfaceView的宽高比
float ratio = (float)width/height;
/*
 * 产生透视矩阵
 * 参数介绍 : 
 * ① 4 * 4 投影矩阵
 * ② 投影矩阵的起始位置
 * 后面的四个参数分别是 左 右 下 上 的距离
 * 最后两个参数是 近视点 和 远视点 距离
 */
Matrix.frustumM(Rectangle.mProjMatrix, 0, -ratio, ratio, -1, 1, 1, 10);
/*
 * 设置摄像机参数矩阵
 * 参数介绍 : 
 * 前两个参数是摄像机参数矩阵 和 矩阵数组的起始位置
 * 后面三个一组是三个空间坐标 先后依次是 摄像机的位置  看的方向 摄像机上方朝向
 */
Matrix.setLookAtM(Rectangle.mVMatrix, 0, 0f,0f,3f,0f,0f,0f,0f,1.0f,0.0f);
}

@Override
public void onDrawFrame(GL10 gl) {
//清除深度缓冲与颜色缓冲
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
//绘制三角形
rect.drawSelf();
}

//定义一个工具方法,将float[]buffer数据转换为OpenGL ES所需要的FloatBuffer
public FloatBuffer floatBufferUtil(float[] arr){
FloatBuffer mbuffer;
//初始化ByteBuffer,长度为arr.length * 4,因为float占4个字节
ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);
//数组排列用nativeOrder
qbb.order(ByteOrder.nativeOrder());

mbuffer = qbb.asFloatBuffer();
mbuffer.put(arr);
mbuffer.position(0);

return mbuffer;
}
//定义一个工具方法,将int[]buffer数据转换为OpenGL ES所需要的IntBuffer
public IntBuffer intBufferUtil(int[] arr){
IntBuffer mbuffer;
//初始化ByteBuffer,长度为arr.length * 4,因为float占4个字节
ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);
//数组排列用nativeOrder
qbb.order(ByteOrder.nativeOrder());

mbuffer = qbb.asIntBuffer();
mbuffer.put(arr);
mbuffer.position(0);
return mbuffer;
}
}



------解决方案--------------------
着色器依赖当前炫染的线程,也就是说不能在其它线程中创建。