opengles绘制可旋转的六角星
生活随笔
收集整理的這篇文章主要介紹了
opengles绘制可旋转的六角星
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.bn.Sample5_1;import android.opengl.Matrix;//存儲系統矩陣狀態的類
public class MatrixState
{private static float[] mProjMatrix = new float[16];//4x4矩陣 投影用private static float[] mVMatrix = new float[16];//攝像機位置朝向9參數矩陣private static float[] mMVPMatrix;//最后起作用的總變換矩陣//設置攝像機public static void setCamera(float cx, //攝像機位置xfloat cy, //攝像機位置yfloat cz, //攝像機位置zfloat tx, //攝像機目標點xfloat ty, //攝像機目標點yfloat tz, //攝像機目標點zfloat upx, //攝像機UP向量X分量float upy, //攝像機UP向量Y分量float upz //攝像機UP向量Z分量 ){Matrix.setLookAtM(mVMatrix, 0, cx,cy,cz,tx,ty,tz,upx,upy,upz);}//設置正交投影參數public static void setProjectOrtho(float left, //near面的leftfloat right, //near面的rightfloat bottom, //near面的bottomfloat top, //near面的topfloat near, //near面距離float far //far面距離){ Matrix.orthoM(mProjMatrix, 0, left, right, bottom, top, near, far);} //獲取具體物體的總變換矩陣public static float[] getFinalMatrix(float[] spec){mMVPMatrix=new float[16];Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, spec, 0);Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0); return mMVPMatrix;}
}
package com.bn.Sample5_1; import android.opengl.GLSurfaceView; import android.view.MotionEvent; import android.opengl.GLES20; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context;class MySurfaceView extends GLSurfaceView {private final float TOUCH_SCALE_FACTOR = 180.0f/320;//角度縮放比例private SceneRenderer mRenderer;//場景渲染器private float mPreviousY;//上次的觸控位置Y坐標private float mPreviousX;//上次的觸控位置X坐標public MySurfaceView(Context context) {super(context);this.setEGLContextClientVersion(2); //設置使用OPENGL ES2.0mRenderer = new SceneRenderer(); //創建場景渲染器setRenderer(mRenderer); //設置渲染器 setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//設置渲染模式為主動渲染 }//觸摸事件回調方法@Override public boolean onTouchEvent(MotionEvent e) {float y = e.getY();float x = e.getX();switch (e.getAction()) {case MotionEvent.ACTION_MOVE:float dy = y - mPreviousY;//計算觸控筆Y位移float dx = x - mPreviousX;//計算觸控筆X位移 for(SixPointedStar h:mRenderer.ha){h.yAngle += dx * TOUCH_SCALE_FACTOR;//設置六角星數組中的各個六角星繞y軸旋轉角度h.xAngle+= dy * TOUCH_SCALE_FACTOR;//設置六角星數組中的各個六角星繞x軸旋轉角度}}mPreviousY = y;//記錄觸控筆位置mPreviousX = x;//記錄觸控筆位置return true;}private class SceneRenderer implements GLSurfaceView.Renderer { SixPointedStar[] ha=new SixPointedStar[6];//六角星數組public void onDrawFrame(GL10 gl) { //清除深度緩沖與顏色緩沖GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);//繪制六角星數組中的各個六角星for(SixPointedStar h:ha){h.drawSelf();}} public void onSurfaceChanged(GL10 gl, int width, int height) {//設置視窗大小及位置 GLES20.glViewport(0, 0, width, height); //計算GLSurfaceView的寬高比float ratio= (float) width / height;//設置平行投影MatrixState.setProjectOrtho(-ratio, ratio, -1, 1, 1, 10); //調用此方法產生攝像機9參數位置矩陣MatrixState.setCamera(0, 0, 3f, 0, 0, 0f, 0f, 1.0f, 0.0f);}public void onSurfaceCreated(GL10 gl, EGLConfig config) {//設置屏幕背景色RGBAGLES20.glClearColor(0.5f,0.5f,0.5f, 1.0f); //創建六角星數組中的各個對象 for(int i=0;i<ha.length;i++){ha[i]=new SixPointedStar(MySurfaceView.this,0.2f,0.5f,-0.3f*i); } //打開深度檢測GLES20.glEnable(GLES20.GL_DEPTH_TEST);}} }
package com.bn.Sample5_1;import java.io.ByteArrayOutputStream; import java.io.InputStream;import android.content.res.Resources; import android.opengl.GLES20; import android.util.Log;//加載頂點Shader與片元Shader的工具類 public class ShaderUtil {//加載制定shader的方法public static int loadShader(int shaderType, //shader的類型 GLES20.GL_VERTEX_SHADER GLES20.GL_FRAGMENT_SHADERString source //shader的腳本字符串) {//創建一個新shaderint shader = GLES20.glCreateShader(shaderType);//若創建成功則加載shaderif (shader != 0) {//加載shader的源代碼GLES20.glShaderSource(shader, source);//編譯shaderGLES20.glCompileShader(shader);//存放編譯成功shader數量的數組int[] compiled = new int[1];//獲取Shader的編譯情況GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);if (compiled[0] == 0) {//若編譯失敗則顯示錯誤日志并刪除此shaderLog.e("ES20_ERROR", "Could not compile shader " + shaderType + ":");Log.e("ES20_ERROR", GLES20.glGetShaderInfoLog(shader));GLES20.glDeleteShader(shader);shader = 0; } }return shader;}//創建shader程序的方法public static int createProgram(String vertexSource, String fragmentSource) {//加載頂點著色器int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);if (vertexShader == 0) {return 0;}//加載片元著色器int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);if (pixelShader == 0) {return 0;}//創建程序int program = GLES20.glCreateProgram();//若程序創建成功則向程序中加入頂點著色器與片元著色器if (program != 0) {//向程序中加入頂點著色器GLES20.glAttachShader(program, vertexShader);checkGlError("glAttachShader");//向程序中加入片元著色器GLES20.glAttachShader(program, pixelShader);checkGlError("glAttachShader");//鏈接程序GLES20.glLinkProgram(program);//存放鏈接成功program數量的數組int[] linkStatus = new int[1];//獲取program的鏈接情況GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);//若鏈接失敗則報錯并刪除程序if (linkStatus[0] != GLES20.GL_TRUE) {Log.e("ES20_ERROR", "Could not link program: ");Log.e("ES20_ERROR", GLES20.glGetProgramInfoLog(program));GLES20.glDeleteProgram(program);program = 0;}}return program;}//檢查每一步操作是否有錯誤的方法 public static void checkGlError(String op) {int error;while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {Log.e("ES20_ERROR", op + ": glError " + error);throw new RuntimeException(op + ": glError " + error);}}//從sh腳本中加載shader內容的方法public static String loadFromAssetsFile(String fname,Resources r){String result=null; try{InputStream in=r.getAssets().open(fname);int ch=0;ByteArrayOutputStream baos = new ByteArrayOutputStream();while((ch=in.read())!=-1){baos.write(ch);} byte[] buff=baos.toByteArray();baos.close();in.close();result=new String(buff,"UTF-8"); result=result.replaceAll("\\r\\n","\n");}catch(Exception e){e.printStackTrace();} return result;} }
package com.bn.Sample5_1; import static com.bn.Sample5_1.ShaderUtil.createProgram;import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.List;import android.opengl.GLES20; import android.opengl.Matrix;//六角星 public class SixPointedStar { int mProgram;//自定義渲染管線著色器程序idint muMVPMatrixHandle;//總變換矩陣引用int maPositionHandle; //頂點位置屬性引用 int maColorHandle; //頂點顏色屬性引用 String mVertexShader; //頂點著色器代碼腳本 String mFragmentShader; //片元著色器代碼腳本static float[] mMMatrix = new float[16]; //具體物體的3D變換矩陣,包括旋轉、平移、縮放FloatBuffer mVertexBuffer;//頂點坐標數據緩沖FloatBuffer mColorBuffer;//頂點著色數據緩沖int vCount=0; float yAngle=0;//繞y軸旋轉的角度float xAngle=0;//繞z軸旋轉的角度final float UNIT_SIZE=1;public SixPointedStar(MySurfaceView mv,float r,float R,float z){ //調用初始化頂點數據的initVertexData方法initVertexData(R,r,z);//調用初始化著色器的intShader方法 initShader(mv);}//自定義初始化頂點數據的initVertexData方法public void initVertexData(float R,float r,float z){List<Float> flist=new ArrayList<Float>();float tempAngle=360/6;for(float angle=0;angle<360;angle+=tempAngle){//第一個三角形//第一個中心點flist.add(0f);flist.add(0f);flist.add(z);//第二個點flist.add((float) (R*UNIT_SIZE*Math.cos(Math.toRadians(angle))));flist.add((float) (R*UNIT_SIZE*Math.sin(Math.toRadians(angle))));flist.add(z);//第三個點flist.add((float) (r*UNIT_SIZE*Math.cos(Math.toRadians(angle+tempAngle/2))));flist.add((float) (r*UNIT_SIZE*Math.sin(Math.toRadians(angle+tempAngle/2))));flist.add(z);//第二個三角形//第一個中心點flist.add(0f);flist.add(0f);flist.add(z);//第二個點flist.add((float) (r*UNIT_SIZE*Math.cos(Math.toRadians(angle+tempAngle/2))));flist.add((float) (r*UNIT_SIZE*Math.sin(Math.toRadians(angle+tempAngle/2))));flist.add(z);//第三個點flist.add((float) (R*UNIT_SIZE*Math.cos(Math.toRadians(angle+tempAngle))));flist.add((float) (R*UNIT_SIZE*Math.sin(Math.toRadians(angle+tempAngle))));flist.add(z);}vCount=flist.size()/3;float[] vertexArray=new float[flist.size()];for(int i=0;i<vCount;i++){vertexArray[i*3]=flist.get(i*3);vertexArray[i*3+1]=flist.get(i*3+1);vertexArray[i*3+2]=flist.get(i*3+2);}ByteBuffer vbb=ByteBuffer.allocateDirect(vertexArray.length*4);vbb.order(ByteOrder.nativeOrder()); //設置字節順序為本地操作系統順序mVertexBuffer=vbb.asFloatBuffer();mVertexBuffer.put(vertexArray);mVertexBuffer.position(0);//頂點著色數據的初始化================begin============================float[] colorArray=new float[vCount*4];for(int i=0;i<vCount;i++){if(i%3==0){//中心點為白色colorArray[i*4]=1;colorArray[i*4+1]=1;colorArray[i*4+2]=1;colorArray[i*4+3]=0;}else{//邊上的點為淡藍色colorArray[i*4]=0.45f;colorArray[i*4+1]=0.75f;colorArray[i*4+2]=0.75f;colorArray[i*4+3]=0;}}ByteBuffer cbb=ByteBuffer.allocateDirect(colorArray.length*4);cbb.order(ByteOrder.nativeOrder()); //設置字節順序為本地操作系統順序mColorBuffer=cbb.asFloatBuffer();mColorBuffer.put(colorArray);mColorBuffer.position(0);//特別提示:由于不同平臺字節順序不同數據單元不是字節的一定要經過ByteBuffer//轉換,關鍵是要通過ByteOrder設置nativeOrder(),否則有可能會出問題//頂點著色數據的初始化================end============================}//自定義初始化著色器的intShader方法public void initShader(MySurfaceView mv){//加載頂點著色器的腳本內容mVertexShader=ShaderUtil.loadFromAssetsFile("vertex.sh", mv.getResources());//加載片元著色器的腳本內容mFragmentShader=ShaderUtil.loadFromAssetsFile("frag.sh", mv.getResources()); //基于頂點著色器與片元著色器創建程序mProgram = createProgram(mVertexShader, mFragmentShader);//獲取程序中頂點位置屬性引用id maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");//獲取程序中頂點顏色屬性引用id maColorHandle= GLES20.glGetAttribLocation(mProgram, "aColor");//獲取程序中總變換矩陣引用idmuMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); }public void drawSelf(){ //制定使用某套shader程序GLES20.glUseProgram(mProgram); //初始化變換矩陣Matrix.setRotateM(mMMatrix,0,0,0,1,0);//設置沿Z軸正向位移1Matrix.translateM(mMMatrix,0,0,0,1);//設置繞y軸旋轉Matrix.rotateM(mMMatrix,0,yAngle,0,1,0);//設置繞z軸旋轉Matrix.rotateM(mMMatrix,0,xAngle,1,0,0); //將最終變換矩陣傳入shader程序GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(mMMatrix), 0); //為畫筆指定頂點位置數據GLES20.glVertexAttribPointer (maPositionHandle, 3, GLES20.GL_FLOAT, false,3*4, mVertexBuffer); //為畫筆指定頂點著色數據GLES20.glVertexAttribPointer (maColorHandle, 4, GLES20.GL_FLOAT, false,4*4, mColorBuffer); //允許頂點位置數據數組GLES20.glEnableVertexAttribArray(maPositionHandle); GLES20.glEnableVertexAttribArray(maColorHandle); //繪制六角星GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vCount); } }
package com.bn.Sample5_1; import android.app.Activity; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.view.Window; import android.view.WindowManager;public class Sample5_1_Activity extends Activity {private MySurfaceView mGLSurfaceView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); //設置為全屏requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN , WindowManager.LayoutParams.FLAG_FULLSCREEN);//設置為橫屏模式setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//初始化GLSurfaceViewmGLSurfaceView = new MySurfaceView(this);//切換到主界面setContentView(mGLSurfaceView);mGLSurfaceView.requestFocus();//獲取焦點mGLSurfaceView.setFocusableInTouchMode(true);//設置為可觸控 }@Overrideprotected void onResume() {super.onResume();mGLSurfaceView.onResume();}@Overrideprotected void onPause() {super.onPause();mGLSurfaceView.onPause();} }
package com.bn.Sample5_1; import android.opengl.GLSurfaceView; import android.view.MotionEvent; import android.opengl.GLES20; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context;class MySurfaceView extends GLSurfaceView {private final float TOUCH_SCALE_FACTOR = 180.0f/320;//角度縮放比例private SceneRenderer mRenderer;//場景渲染器private float mPreviousY;//上次的觸控位置Y坐標private float mPreviousX;//上次的觸控位置X坐標public MySurfaceView(Context context) {super(context);this.setEGLContextClientVersion(2); //設置使用OPENGL ES2.0mRenderer = new SceneRenderer(); //創建場景渲染器setRenderer(mRenderer); //設置渲染器 setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//設置渲染模式為主動渲染 }//觸摸事件回調方法@Override public boolean onTouchEvent(MotionEvent e) {float y = e.getY();float x = e.getX();switch (e.getAction()) {case MotionEvent.ACTION_MOVE:float dy = y - mPreviousY;//計算觸控筆Y位移float dx = x - mPreviousX;//計算觸控筆X位移 for(SixPointedStar h:mRenderer.ha){h.yAngle += dx * TOUCH_SCALE_FACTOR;//設置六角星數組中的各個六角星繞y軸旋轉角度h.xAngle+= dy * TOUCH_SCALE_FACTOR;//設置六角星數組中的各個六角星繞x軸旋轉角度}}mPreviousY = y;//記錄觸控筆位置mPreviousX = x;//記錄觸控筆位置return true;}private class SceneRenderer implements GLSurfaceView.Renderer { SixPointedStar[] ha=new SixPointedStar[6];//六角星數組public void onDrawFrame(GL10 gl) { //清除深度緩沖與顏色緩沖GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);//繪制六角星數組中的各個六角星for(SixPointedStar h:ha){h.drawSelf();}} public void onSurfaceChanged(GL10 gl, int width, int height) {//設置視窗大小及位置 GLES20.glViewport(0, 0, width, height); //計算GLSurfaceView的寬高比float ratio= (float) width / height;//設置平行投影MatrixState.setProjectOrtho(-ratio, ratio, -1, 1, 1, 10); //調用此方法產生攝像機9參數位置矩陣MatrixState.setCamera(0, 0, 3f, 0, 0, 0f, 0f, 1.0f, 0.0f);}public void onSurfaceCreated(GL10 gl, EGLConfig config) {//設置屏幕背景色RGBAGLES20.glClearColor(0.5f,0.5f,0.5f, 1.0f); //創建六角星數組中的各個對象 for(int i=0;i<ha.length;i++){ha[i]=new SixPointedStar(MySurfaceView.this,0.2f,0.5f,-0.3f*i); } //打開深度檢測GLES20.glEnable(GLES20.GL_DEPTH_TEST);}} }
package com.bn.Sample5_1;import java.io.ByteArrayOutputStream; import java.io.InputStream;import android.content.res.Resources; import android.opengl.GLES20; import android.util.Log;//加載頂點Shader與片元Shader的工具類 public class ShaderUtil {//加載制定shader的方法public static int loadShader(int shaderType, //shader的類型 GLES20.GL_VERTEX_SHADER GLES20.GL_FRAGMENT_SHADERString source //shader的腳本字符串) {//創建一個新shaderint shader = GLES20.glCreateShader(shaderType);//若創建成功則加載shaderif (shader != 0) {//加載shader的源代碼GLES20.glShaderSource(shader, source);//編譯shaderGLES20.glCompileShader(shader);//存放編譯成功shader數量的數組int[] compiled = new int[1];//獲取Shader的編譯情況GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);if (compiled[0] == 0) {//若編譯失敗則顯示錯誤日志并刪除此shaderLog.e("ES20_ERROR", "Could not compile shader " + shaderType + ":");Log.e("ES20_ERROR", GLES20.glGetShaderInfoLog(shader));GLES20.glDeleteShader(shader);shader = 0; } }return shader;}//創建shader程序的方法public static int createProgram(String vertexSource, String fragmentSource) {//加載頂點著色器int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);if (vertexShader == 0) {return 0;}//加載片元著色器int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);if (pixelShader == 0) {return 0;}//創建程序int program = GLES20.glCreateProgram();//若程序創建成功則向程序中加入頂點著色器與片元著色器if (program != 0) {//向程序中加入頂點著色器GLES20.glAttachShader(program, vertexShader);checkGlError("glAttachShader");//向程序中加入片元著色器GLES20.glAttachShader(program, pixelShader);checkGlError("glAttachShader");//鏈接程序GLES20.glLinkProgram(program);//存放鏈接成功program數量的數組int[] linkStatus = new int[1];//獲取program的鏈接情況GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);//若鏈接失敗則報錯并刪除程序if (linkStatus[0] != GLES20.GL_TRUE) {Log.e("ES20_ERROR", "Could not link program: ");Log.e("ES20_ERROR", GLES20.glGetProgramInfoLog(program));GLES20.glDeleteProgram(program);program = 0;}}return program;}//檢查每一步操作是否有錯誤的方法 public static void checkGlError(String op) {int error;while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {Log.e("ES20_ERROR", op + ": glError " + error);throw new RuntimeException(op + ": glError " + error);}}//從sh腳本中加載shader內容的方法public static String loadFromAssetsFile(String fname,Resources r){String result=null; try{InputStream in=r.getAssets().open(fname);int ch=0;ByteArrayOutputStream baos = new ByteArrayOutputStream();while((ch=in.read())!=-1){baos.write(ch);} byte[] buff=baos.toByteArray();baos.close();in.close();result=new String(buff,"UTF-8"); result=result.replaceAll("\\r\\n","\n");}catch(Exception e){e.printStackTrace();} return result;} }
package com.bn.Sample5_1; import static com.bn.Sample5_1.ShaderUtil.createProgram;import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.List;import android.opengl.GLES20; import android.opengl.Matrix;//六角星 public class SixPointedStar { int mProgram;//自定義渲染管線著色器程序idint muMVPMatrixHandle;//總變換矩陣引用int maPositionHandle; //頂點位置屬性引用 int maColorHandle; //頂點顏色屬性引用 String mVertexShader; //頂點著色器代碼腳本 String mFragmentShader; //片元著色器代碼腳本static float[] mMMatrix = new float[16]; //具體物體的3D變換矩陣,包括旋轉、平移、縮放FloatBuffer mVertexBuffer;//頂點坐標數據緩沖FloatBuffer mColorBuffer;//頂點著色數據緩沖int vCount=0; float yAngle=0;//繞y軸旋轉的角度float xAngle=0;//繞z軸旋轉的角度final float UNIT_SIZE=1;public SixPointedStar(MySurfaceView mv,float r,float R,float z){ //調用初始化頂點數據的initVertexData方法initVertexData(R,r,z);//調用初始化著色器的intShader方法 initShader(mv);}//自定義初始化頂點數據的initVertexData方法public void initVertexData(float R,float r,float z){List<Float> flist=new ArrayList<Float>();float tempAngle=360/6;for(float angle=0;angle<360;angle+=tempAngle){//第一個三角形//第一個中心點flist.add(0f);flist.add(0f);flist.add(z);//第二個點flist.add((float) (R*UNIT_SIZE*Math.cos(Math.toRadians(angle))));flist.add((float) (R*UNIT_SIZE*Math.sin(Math.toRadians(angle))));flist.add(z);//第三個點flist.add((float) (r*UNIT_SIZE*Math.cos(Math.toRadians(angle+tempAngle/2))));flist.add((float) (r*UNIT_SIZE*Math.sin(Math.toRadians(angle+tempAngle/2))));flist.add(z);//第二個三角形//第一個中心點flist.add(0f);flist.add(0f);flist.add(z);//第二個點flist.add((float) (r*UNIT_SIZE*Math.cos(Math.toRadians(angle+tempAngle/2))));flist.add((float) (r*UNIT_SIZE*Math.sin(Math.toRadians(angle+tempAngle/2))));flist.add(z);//第三個點flist.add((float) (R*UNIT_SIZE*Math.cos(Math.toRadians(angle+tempAngle))));flist.add((float) (R*UNIT_SIZE*Math.sin(Math.toRadians(angle+tempAngle))));flist.add(z);}vCount=flist.size()/3;float[] vertexArray=new float[flist.size()];for(int i=0;i<vCount;i++){vertexArray[i*3]=flist.get(i*3);vertexArray[i*3+1]=flist.get(i*3+1);vertexArray[i*3+2]=flist.get(i*3+2);}ByteBuffer vbb=ByteBuffer.allocateDirect(vertexArray.length*4);vbb.order(ByteOrder.nativeOrder()); //設置字節順序為本地操作系統順序mVertexBuffer=vbb.asFloatBuffer();mVertexBuffer.put(vertexArray);mVertexBuffer.position(0);//頂點著色數據的初始化================begin============================float[] colorArray=new float[vCount*4];for(int i=0;i<vCount;i++){if(i%3==0){//中心點為白色colorArray[i*4]=1;colorArray[i*4+1]=1;colorArray[i*4+2]=1;colorArray[i*4+3]=0;}else{//邊上的點為淡藍色colorArray[i*4]=0.45f;colorArray[i*4+1]=0.75f;colorArray[i*4+2]=0.75f;colorArray[i*4+3]=0;}}ByteBuffer cbb=ByteBuffer.allocateDirect(colorArray.length*4);cbb.order(ByteOrder.nativeOrder()); //設置字節順序為本地操作系統順序mColorBuffer=cbb.asFloatBuffer();mColorBuffer.put(colorArray);mColorBuffer.position(0);//特別提示:由于不同平臺字節順序不同數據單元不是字節的一定要經過ByteBuffer//轉換,關鍵是要通過ByteOrder設置nativeOrder(),否則有可能會出問題//頂點著色數據的初始化================end============================}//自定義初始化著色器的intShader方法public void initShader(MySurfaceView mv){//加載頂點著色器的腳本內容mVertexShader=ShaderUtil.loadFromAssetsFile("vertex.sh", mv.getResources());//加載片元著色器的腳本內容mFragmentShader=ShaderUtil.loadFromAssetsFile("frag.sh", mv.getResources()); //基于頂點著色器與片元著色器創建程序mProgram = createProgram(mVertexShader, mFragmentShader);//獲取程序中頂點位置屬性引用id maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");//獲取程序中頂點顏色屬性引用id maColorHandle= GLES20.glGetAttribLocation(mProgram, "aColor");//獲取程序中總變換矩陣引用idmuMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); }public void drawSelf(){ //制定使用某套shader程序GLES20.glUseProgram(mProgram); //初始化變換矩陣Matrix.setRotateM(mMMatrix,0,0,0,1,0);//設置沿Z軸正向位移1Matrix.translateM(mMMatrix,0,0,0,1);//設置繞y軸旋轉Matrix.rotateM(mMMatrix,0,yAngle,0,1,0);//設置繞z軸旋轉Matrix.rotateM(mMMatrix,0,xAngle,1,0,0); //將最終變換矩陣傳入shader程序GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(mMMatrix), 0); //為畫筆指定頂點位置數據GLES20.glVertexAttribPointer (maPositionHandle, 3, GLES20.GL_FLOAT, false,3*4, mVertexBuffer); //為畫筆指定頂點著色數據GLES20.glVertexAttribPointer (maColorHandle, 4, GLES20.GL_FLOAT, false,4*4, mColorBuffer); //允許頂點位置數據數組GLES20.glEnableVertexAttribArray(maPositionHandle); GLES20.glEnableVertexAttribArray(maColorHandle); //繪制六角星GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vCount); } }
package com.bn.Sample5_1; import android.app.Activity; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.view.Window; import android.view.WindowManager;public class Sample5_1_Activity extends Activity {private MySurfaceView mGLSurfaceView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); //設置為全屏requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN , WindowManager.LayoutParams.FLAG_FULLSCREEN);//設置為橫屏模式setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//初始化GLSurfaceViewmGLSurfaceView = new MySurfaceView(this);//切換到主界面setContentView(mGLSurfaceView);mGLSurfaceView.requestFocus();//獲取焦點mGLSurfaceView.setFocusableInTouchMode(true);//設置為可觸控 }@Overrideprotected void onResume() {super.onResume();mGLSurfaceView.onResume();}@Overrideprotected void onPause() {super.onPause();mGLSurfaceView.onPause();} }
完整項目下載地址
http://download.csdn.net/detail/hb707934728/9591801
總結
以上是生活随笔為你收集整理的opengles绘制可旋转的六角星的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac book a1278
- 下一篇: 超通俗易懂的Servlet入门教程