生活随笔
收集整理的這篇文章主要介紹了
六角星的创建
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
其基本效果圖如下所示:
Sixpointed stars類:
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); }
}
轉載于:https://www.cnblogs.com/Anzhongliu/p/6092115.html
總結
以上是生活随笔為你收集整理的六角星的创建的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。