Android openGL ES上色,创建顶点shader失败
Android openGL ES着色,创建顶点shader失败
最近在学Android上的OpenGL ES,学到着色这一块,除了个问题,一直没有解决:还请大神帮帮忙:
以下是我的代码:
分为四个部分:主界面MainActivity.java、渲染类Renderer(MyRenderer.java)、画正方形的类Rectangle.java、以及一个做shader操作的类ShaderUtil.java
MainActivity.java:
MyRenderer.java:
------解决方案--------------------
着色器依赖当前炫染的线程,也就是说不能在其它线程中创建。
最近在学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;
}
}
------解决方案--------------------
着色器依赖当前炫染的线程,也就是说不能在其它线程中创建。