public class dotClass extends GLSurfaceView {
private trangleFan tFan2d;
//0x10000似乎是一个像素的距离
int one = 0x10000;
int vertex[] = {
one*200, one*200,
one*300, one*500,
};
//为各个点提供颜色,不知道出了rgb以外的颜色怎么提供
int color[] = {
one, one , one, one,
one, one, 0, one,
};
int triangleColor[] = {
one, 0, 0, one,
0, one, 0, one,
0, 0, one, one,
};
int triangleVertex[] = {
0, 0,
100*one, 0,
50*one, 100*one,
};
public dotClass( Context ctx){
super( ctx );
Init();
}
public dotClass( Context ctx, AttributeSet attrs){
super( ctx, attrs );
Init();
}
//
private void Init(){
tFan2d=new trangleFan( triangleVertex, triangleColor );
this.setRenderer( renderer );
}
GLSurfaceView.Renderer renderer=new Renderer(){
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
gl.glClear( GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT );
drawLine(gl, vertex, color, 5);
drawPoint(gl, vertex, color, 20);
// tFan.draw( gl );
tFan2d.draw(gl);
// tStrip.draw(gl);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
//首先是opengl可用的空间 :
gl.glViewport( 0, 0, width/2, height/2 );
//这个matrix是如何把三维坐标转换为二维坐标并把它放在显示器上。
gl.glMatrixMode( GL10.GL_PROJECTION );
//告诉opengl初始化这个matrix。
gl.glLoadIdentity();
GLU.gluOrtho2D( gl, 0.0f, width, 0.0f, height );
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
//设置北京颜色
gl.glClearColor( 0.0f, 1.0f, 1.0f, 0.0f ); //
gl.glShadeModel( GL10.GL_FLAT ); //
gl.glHint( GL10.GL_POINT_SMOOTH_HINT, GL10.GL_FASTEST ); //
//使gl可以接受位置数组
gl.glEnableClientState( GL10.GL_VERTEX_ARRAY ); //set for array as vertex
//使gl可以接受颜色数组
gl.glEnableClientState( GL10.GL_COLOR_ARRAY ); //set for array as color
gl.glDisable( GL10.GL_TEXTURE_2D ); //no 2
}
};
//将int数组转化成inbuff类型,为glVertexPointer,glColorPointer方法用
private IntBuffer getIntBuffer( int[] table ) {
ByteBuffer bb = ByteBuffer.allocateDirect( table.length * 4 );
bb.order( ByteOrder.nativeOrder() );
IntBuffer ib = bb.asIntBuffer();
ib.put( table );
ib.position( 0 );
return ib;
}
private void drawPoint( GL10 gl, int[] vertex, int[] color, int size ){
//gl的大小,也就是下边的点的尺寸
gl.glPointSize(size );
//vertex数组里存的坐标,这里的2代表2维,就是数组里面的数字2个位一族表示一个点的位置。需要装成buff
gl.glVertexPointer( 2, GL10.GL_FIXED, 0, getIntBuffer( vertex ) );
//color数组里面存储的点的颜色,这里的4代表RGBA类型颜色。也需要妆化成buff
gl.glColorPointer( 4, GL10.GL_FIXED, 0, getIntBuffer( color ) );
//告诉gl画什么图形,这里的2代表画多少个点,及数组里面包含多少个点
gl.glDrawArrays( GL10.GL_POINTS, 0, 2 );
}
private void drawLine( GL10 gl, int[] vertex, int[] color, int size ){
gl.glLineWidth( size ); //set line width
gl.glVertexPointer( 2, GL10.GL_FIXED, 0, getIntBuffer( vertex ) ); //set vertex points
gl.glColorPointer( 4, GL10.GL_FIXED, 0, getIntBuffer( color ) ); //set color points
gl.glDrawArrays( GL10.GL_LINES, 0, 1*2 ); //mode is GL_LINES
}
class trangleFan{
private IntBuffer vertexBuff = null;
private IntBuffer colorBuff = null;
private int pointNum;
public trangleFan( int vertex[], int color[] ){
if( vertex != null ){
vertexBuff = getIntBuffer( vertex );
pointNum = vertex.length / 2;
}
if( color != null ){
colorBuff = getIntBuffer( color );
}
}
public void draw( GL10 gl ){
if( vertexBuff != null ){
gl.glVertexPointer( 2, GL10.GL_FIXED, 0, vertexBuff );
gl.glColorPointer( 4, GL10.GL_FIXED, 0, colorBuff );
gl.glDrawArrays( GL10.GL_TRIANGLES, 0, pointNum );
}
}
}
}
http://code.google.com/p/linuxgraphicsweb/source/browse/trunk/Pages/android/gallery3d_glsurfaceview.muse?spec=svn176&r=176