鍍金池/ 教程/ Android/ 繪制點(diǎn) Point
繪制線(xiàn)段 Line Segment
投影變換 Projection
繪制迷你太陽(yáng)系
繪制一個(gè)球體
繪制三角形 Triangle
OpenGL 光照模型
三維坐標(biāo)系及坐標(biāo)變換初步
定義 3D 模型的前面和后面
繪制一個(gè) 20 面體
顏色 Color
Depth Buffer
材質(zhì)及光照示例
基本幾何圖形定義
關(guān)于EGL
導(dǎo)言
Viewing 和 Modeling(MODELVIEW) 變換
FrameBuffer
設(shè)置光照效果 Set Lighting
Viewport 變換
階段小結(jié)
繪制點(diǎn) Point
OpenGL ES API 命名習(xí)慣
通用的矩陣變換指令
關(guān)于 OpenGL ES
創(chuàng)建實(shí)例應(yīng)用 OpenGLDemos 程序框架
OpenGL ES 管道(Pipeline)
GLSurfaceView

繪制點(diǎn) Point

上一篇介紹了 OpenGL ES 能夠繪制的幾種基本幾何圖形:點(diǎn),線(xiàn),三角形。將分別介紹這幾種基本幾何圖形的例子。為方便起見(jiàn),暫時(shí)在同一平面上繪制這些幾何圖形,在后面介紹完 OpenGL ES 的坐標(biāo)系統(tǒng)和坐標(biāo)變換后,再介紹真正的 3D 圖形繪制方法。

在 Android OpenGL ES 開(kāi)發(fā)教程(7):創(chuàng)建實(shí)例應(yīng)用 OpenGLDemos 程序框架 創(chuàng)建了示例應(yīng)用的程序框架,并提供了一個(gè)“Hello World”示例。

為避免一些重復(fù)代碼,這里定義一個(gè)所有示例代碼的基類(lèi) OpenGLESActivity,其定義如下:

public class OpenGLESActivity extends Activity
 implements IOpenGLDemo{
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 this.requestWindowFeature(Window.FEATURE_NO_TITLE);
 getWindow().setFlags(
 WindowManager.LayoutParams.FLAG_FULLSCREEN,
 WindowManager.LayoutParams.FLAG_FULLSCREEN);
 mGLSurfaceView = new GLSurfaceView(this);
 mGLSurfaceView.setRenderer(new OpenGLRenderer(this));
 setContentView(mGLSurfaceView);
 }
 public void DrawScene(GL10 gl) {
 gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 // Clears the screen and depth buffer.
 gl.glClear(GL10.GL_COLOR_BUFFER_BIT
 | GL10.GL_DEPTH_BUFFER_BIT);
 }
 @Override
 protected void onResume() {
 // Ideally a game should implement onResume() and onPause()
 // to take appropriate action when the activity looses focus
 super.onResume();
 mGLSurfaceView.onResume();
 }
 @Override
 protected void onPause() {
 // Ideally a game should implement onResume() and onPause()
 // to take appropriate action when the activity looses focus
 super.onPause();
 mGLSurfaceView.onPause();
 }
 protected GLSurfaceView mGLSurfaceView;
}  
  • 在onCreate 方法中創(chuàng)建一個(gè) GLSurfaceView mGLSurfaceView,并將屏幕設(shè)置為全屏。并為mGLSurfaceView 設(shè)置 Render。
  • onResume,onPause 處理 GLSurfaceView 的暫停和恢復(fù)。
  • DrawScene 使用黑色清空屏幕。

OpenGL ES 內(nèi)部存放圖形數(shù)據(jù)的 Buffer 有 COLOR ,DEPTH (深度信息)等,在繪制圖形只前一般需要清空 COLOR 和 DEPTH Buffer。

本例在屏幕上使用紅色繪制 3 個(gè)點(diǎn)。創(chuàng)建一個(gè) DrawPoint 作為 OpenGLESActivity 的子類(lèi),并定義 3 個(gè)頂點(diǎn)的坐標(biāo):

public class DrawPoint extends OpenGLESActivity
 implements IOpenGLDemo{
 float[] vertexArray = new float[]{
 -0.8f , -0.4f * 1.732f , 0.0f ,
 0.8f , -0.4f * 1.732f , 0.0f ,
 0.0f , 0.4f * 1.732f , 0.0f ,
 };
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 }
 ...
}  

下面為 DrawPoint 的 DrawScene 的實(shí)現(xiàn):

public void DrawScene(GL10 gl) {
 super.DrawScene(gl);
 ByteBuffer vbb
 = ByteBuffer.allocateDirect(vertexArray.length*4);
 vbb.order(ByteOrder.nativeOrder());
 FloatBuffer vertex = vbb.asFloatBuffer();
 vertex.put(vertexArray);
 vertex.position(0);
 gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
 gl.glPointSize(8f);
 gl.glLoadIdentity();
 gl.glTranslatef(0, 0, -4);
 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertex);
 gl.glDrawArrays(GL10.GL_POINTS, 0, 3);
 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}  
  • 首先是使用 FloatBuffer 存放三個(gè)頂點(diǎn)坐標(biāo)。
  • 使用 glColor4f(float red, float green, float blue, float alpha) 將當(dāng)前顏色設(shè)為紅色。
  • glPointSize(float size) 可以用來(lái)設(shè)置繪制點(diǎn)的大小。
  • 使用 glEnableClientState 打開(kāi) Pipeline 的Vectex 頂點(diǎn)“開(kāi)關(guān)”
  • 使用 glVertexPointer 通知 OpenGL ES 圖形庫(kù)頂點(diǎn)坐標(biāo)。
  • 使用 GL_POINTS 模式使用 glDrawArrays 繪制 3 個(gè)頂點(diǎn)。

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/56.png" alt="" />

本例下載