這是我在android下用OGL ES畫的第一個圖形,Render的override部分引用了其它同學的一些代碼
怎麼上截圖?
Java代碼
- public class GLRender implements Renderer{
-
-
- float rotateAngle;
-
- //頂點數組,GL ES只能用這個辦法畫圓嗎?
- private float[] vertices = new float[720];
-
- //度到弧度的轉換
- public float DegToRad(float deg)
- {
- return (float) (3.14159265358979323846 * deg / 180.0);
- }
-
-
- @Override
- public void onDrawFrame(GL10 gl) {
- // TODO Auto-generated method stub
-
- // 進入這個函數第一件要做的事就是清除屏幕和深度緩存
- gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
-
- //畫圓形
- drawCircle(gl);
- }
-
- public void drawCircle(GL10 gl)
- {
- //重置投影矩陣
- gl.glLoadIdentity();
- // 移動操作,移入屏幕(Z軸)5個像素, x, y , z
- gl.glTranslatef(0.0f, 0.0f, -5.0f);
-
- //旋轉, angle, x, y , z
- gl.glRotatef(rotateAngle, 1.0f, 0.0f, 0.0f);
-
- // 設置當前色為紅色, R, G, B, Alpha
- gl.glColor4f(1.0f, 0.1f, 0.1f, 1.0f);
-
- //設置圓形頂點數據,這個是在創建時生成
- FloatBuffer verBuffer = FloatBuffer.wrap(vertices);
-
- //設置頂點類型為浮點坐標(GL_FLOAT),不設置或者設置錯誤類型將導致圖形不能顯示或者顯示錯誤
- gl.glVertexPointer(2, GL10.GL_FLOAT, 0, verBuffer);
-
- //打開頂點數組
- gl.glEnableClIEntState(GL10.GL_VERTEX_ARRAY);
-
- //向OGL發送實際畫圖指令
- gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 360);
-
- //關閉頂點數組功能
- gl.glDisableClIEntState(GL10.GL_VERTEX_ARRAY);
-
- //畫圖結束
- gl.glFinish();
-
- //更改旋轉角度
- rotateAngle += 0.5;
- }
-
-
- @Override
- public void onSurfaceChanged(GL10 gl, int width, int height) {
- // TODO Auto-generated method stub
-
- float ratio = (float) width / height;
- //設置OpenGL場景的大小
- gl.glVIEwport(0, 0, width, height);
- //設置投影矩陣
- gl.glMatrixMode(GL10.GL_PROJECTION);
- //重置投影矩陣
- gl.glLoadIdentity();
- // 設置視口的大小
- gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
- // 選擇模型觀察矩陣
- gl.glMatrixMode(GL10.GL_MODELVIEW);
- // 重置模型觀察矩陣
- gl.glLoadIdentity();
-
- }
-
- @Override
- public void onSurfaceCreated(GL10 gl, EGLConfig config) {
- // TODO Auto-generated method stub
- // 啟用陰影平滑
- gl.glShadeModel(GL10.GL_SMOOTH);
- // 黑色背景
- gl.glClearColor(0, 0, 0, 0);
- // 設置深度緩存
- gl.glClearDepthf(1.0f);
- // 啟用深度測試
- gl.glEnable(GL10.GL_DEPTH_TEST);
- // 所作深度測試的類型
- gl.glDepthFunc(GL10.GL_LEQUAL);
-
- // 告訴系統對透視進行修正
- gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
-
-
- //初始化圓形數據
- for (int i = 0; i < 720; i += 2) {
- // x value
- vertices[i] = (float) (Math.cos(DegToRad(i)) * 1);
- // y value
- vertices[i+1] = (float) (Math.sin(DegToRad(i)) * 1);
- }
- }
- }
復制打印
- public class GLRender implements Renderer{
-
-
- float rotateAngle;
-
- //頂點數組,GL ES只能用這個辦法畫圓嗎?
- private float[] vertices = new float[720];
-
- //度到弧度的轉換
- public float DegToRad(float deg)
- {
- return (float) (3.14159265358979323846 * deg / 180.0);
- }
-
-
- @Override
- public void onDrawFrame(GL10 gl) {
- // TODO Auto-generated method stub
-
- // 進入這個函數第一件要做的事就是清除屏幕和深度緩存
- gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
-
- //畫圓形
- drawCircle(gl);
- }
-
- public void drawCircle(GL10 gl)
- {
- //重置投影矩陣
- gl.glLoadIdentity();
- // 移動操作,移入屏幕(Z軸)5個像素, x, y , z
- gl.glTranslatef(0.0f, 0.0f, -5.0f);
-
- //旋轉, angle, x, y , z
- gl.glRotatef(rotateAngle, 1.0f, 0.0f, 0.0f);
-
- // 設置當前色為紅色, R, G, B, Alpha
- gl.glColor4f(1.0f, 0.1f, 0.1f, 1.0f);
-
- //設置圓形頂點數據,這個是在創建時生成
- FloatBuffer verBuffer = FloatBuffer.wrap(vertices);
-
- //設置頂點類型為浮點坐標(GL_FLOAT),不設置或者設置錯誤類型將導致圖形不能顯示或者顯示錯誤
- gl.glVertexPointer(2, GL10.GL_FLOAT, 0, verBuffer);
-
- //打開頂點數組
- gl.glEnableClIEntState(GL10.GL_VERTEX_ARRAY);
-
- //向OGL發送實際畫圖指令
- gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 360);
-
- //關閉頂點數組功能
- gl.glDisableClIEntState(GL10.GL_VERTEX_ARRAY);
-
- //畫圖結束
- gl.glFinish();
-
- //更改旋轉角度
- rotateAngle += 0.5;
- }
-
-
- @Override
- public void onSurfaceChanged(GL10 gl, int width, int height) {
- // TODO Auto-generated method stub
-
- float ratio = (float) width / height;
- //設置OpenGL場景的大小
- gl.glVIEwport(0, 0, width, height);
- //設置投影矩陣
- gl.glMatrixMode(GL10.GL_PROJECTION);
- //重置投影矩陣
- gl.glLoadIdentity();
- // 設置視口的大小
- gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
- // 選擇模型觀察矩陣
- gl.glMatrixMode(GL10.GL_MODELVIEW);
- // 重置模型觀察矩陣
- gl.glLoadIdentity();
-
- }
-
- @Override
- public void onSurfaceCreated(GL10 gl, EGLConfig config) {
- // TODO Auto-generated method stub
- // 啟用陰影平滑
- gl.glShadeModel(GL10.GL_SMOOTH);
- // 黑色背景
- gl.glClearColor(0, 0, 0, 0);
- // 設置深度緩存
- gl.glClearDepthf(1.0f);
- // 啟用深度測試
- gl.glEnable(GL10.GL_DEPTH_TEST);
- // 所作深度測試的類型
- gl.glDepthFunc(GL10.GL_LEQUAL);
-
- // 告訴系統對透視進行修正
- gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
-
-
- //初始化圓形數據
- for (int i = 0; i < 720; i += 2) {
- // x value
- vertices[i] = (float) (Math.cos(DegToRad(i)) * 1);
- // y value
- vertices[i+1] = (float) (Math.sin(DegToRad(i)) * 1);
- }
- }
- }
public class GLRender implements Renderer{
float rotateAngle;
//頂點數組,GL ES只能用這個辦法畫圓嗎?
private float[] vertices = new float[720];
//度到弧度的轉換
public float DegToRad(float deg)
{
return (float) (3.14159265358979323846 * deg / 180.0);
}
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
// 進入這個函數第一件要做的事就是清除屏幕和深度緩存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
//畫圓形
drawCircle(gl);
}
public void drawCircle(GL10 gl)
{
//重置投影矩陣
gl.glLoadIdentity();
// 移動操作,移入屏幕(Z軸)5個像素, x, y , z
gl.glTranslatef(0.0f, 0.0f, -5.0f);
//旋轉, angle, x, y , z
gl.glRotatef(rotateAngle, 1.0f, 0.0f, 0.0f);
// 設置當前色為紅色, R, G, B, Alpha
gl.glColor4f(1.0f, 0.1f, 0.1f, 1.0f);
//設置圓形頂點數據,這個是在創建時生成
FloatBuffer verBuffer = FloatBuffer.wrap(vertices);
//設置頂點類型為浮點坐標(GL_FLOAT),不設置或者設置錯誤類型將導致圖形不能顯示或者顯示錯誤
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, verBuffer);
//打開頂點數組
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//向OGL發送實際畫圖指令
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 360);
//關閉頂點數組功能
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
//畫圖結束
gl.glFinish();
//更改旋轉角度
rotateAngle += 0.5;
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
float ratio = (float) width / height;
//設置OpenGL場景的大小
gl.glViewport(0, 0, width, height);
//設置投影矩陣
gl.glMatrixMode(GL10.GL_PROJECTION);
//重置投影矩陣
gl.glLoadIdentity();
// 設置視口的大小
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
// 選擇模型觀察矩陣
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置模型觀察矩陣
gl.glLoadIdentity();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
// 啟用陰影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 黑色背景
gl.glClearColor(0, 0, 0, 0);
// 設置深度緩存
gl.glClearDepthf(1.0f);
// 啟用深度測試
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度測試的類型
gl.glDepthFunc(GL10.GL_LEQUAL);
// 告訴系統對透視進行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
//初始化圓形數據
for (int i = 0; i < 720; i += 2) {
// x value
vertices[i] = (float) (Math.cos(DegToRad(i)) * 1);
// y value
vertices[i+1] = (float) (Math.sin(DegToRad(i)) * 1);
}
}
}
完整程序見附件
再補充一點:
上面的例子畫的是實心的圓,如果想畫空心的圓只要把這句:
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 360);
改為
gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, 360);
即可