opengl 学习了快一个月了主要是参考午王的博客来学习的:
http://blog.csdn.net/junzia/article/category/6462864
下面是自己封装的着色器工具类:
public class ShaderUtils {
public static int createprograms(String vertpath1,String fragpath2){
int vertextype= GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
GLES20.glShaderSource(vertextype,getstr(vertpath1));
GLES20.glCompileShader(vertextype);
int fragtype=GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
GLES20.glShaderSource(fragtype,getstr(fragpath2));
GLES20.glCompileShader(fragtype);
int programs=GLES20.glCreateProgram();
GLES20.glAttachShader(programs,vertextype);
GLES20.glAttachShader(programs,fragtype);
GLES20.glLinkProgram(programs);
return programs;
}
public static String getstr(String path1){
try {
Log.e( "getstr: ","aaaaaaaa" );
InputStream input=Tp.app.getAssets().open(path1);
int len=input.available();
byte[]bytes=new byte[len];
input.read(bytes);
String str=new String(bytes);
Log.e("getstr: ",str );
return str;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
在render中动态更改贴图:
@Override
public void onDrawFrame(GL10 gl10) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT|GLES20.GL_DEPTH_BUFFER_BIT);
if (change){
Log.e( "onDrawFrame: ","qqqqq" );
textureId =createTexture();
calculateAttribute();
change=false;
}
计算贴图是耗时操作只在更改时更改.
list =new ArrayList<>();
list.add("vr/1.jpg");
list1.add("房间1");
list.add("vr/2.jpg");
list1.add("房间2");
list.add("vr/3.jpg");
list1.add("房间3");
list.add("vr/4.jpg");
list1.add("九寨沟");
list.add("vr/5.jpg");
list1.add("安徽章山大峡谷");
list.add("vr/6.jpg");
list1.add("四川黄龙景区");
list.add("vr/7.jpg");
list1.add("芙蓉洞金銮宝殿");
list.add("vr/8.jpg");
list1.add("深圳海上田园");
list.add("vr/9.jpg");
list1.add("花都新加坡");
list.add("vr/10.jpg");
list1.add("赤壁卧龙槐");
list.add("vr/11.jpg");
list1.add("珠穆朗玛");
spinner = ((Spinner) findViewById(R.id.spinner));
spinner.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list1));
glview = ((GLView) findViewById(R.id.glview));
init(glview);
mSensorManager =(SensorManager)getSystemService(Context.SENSOR_SERVICE);
List<Sensor> sensors= mSensorManager.getSensorList(Sensor.TYPE_ALL);
mRotation =mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
if (first){
Log.e( "onItemSelected: ","1111" );
glview.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
// ((VrRender) renderer).create();
((VrRender) renderer).change=true;
((VrRender) renderer).setbtmap(MainActivity.this,list.get(i));
// glview.onResume();
glview. requestRender();
// glview. requestRender();
glview.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
}
first=true;
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
动态更改文理贴图:
使用dirty模式更改再切换回动画模式
这是自己加的一些,其他的还是去参考午王的博客,他写的比我的好多了。
学了这么久好歹也是有些入门了。
项目下载地址:
http://pan.baidu.com/s/1kVPzfAf