原文链接:http://docs.eoeandroid.com/training/graphics/OpenGL/shapes.html
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:申请域名、雅安服务器托管、营销软件、网站建设、陆良网站维护、网站推广。
在OpenGL ES视图中定义所要绘制的图形,是创建高质量图形的第一步。使用OpenGL ES绘制图形时,如果不了解怎样基于OpenGL ES定义图形对象,将会是一件棘手的事。 这节课将介绍以Android设备屏幕为基准的OpenGL ES坐标系统,定义图形的基本方法,图形轮廓,以及定义三角形、方形。
OpenGL ES允许可以在三维坐标上定义你要绘制的对象。所以,在绘制三角形前,你要定义好它的坐标。在OpenGL中,定义坐标最典型的方法,就是定义坐标定点的一组浮点型数据。为了提高效率,你可以把这些坐标值写进一组ByteBuffer,它将会传递给OpenGL ES图形管道进行处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class Triangle { private FloatBuffer vertexBuffer; // number of coordinates per vertex in this array static final int COORDS_PER_VERTEX = 3; static float triangleCoords[] = { // in counterclockwise order: 0.0f, 0.622008459f, 0.0f, // top -0.5f, -0.311004243f, 0.0f, // bottom left 0.5f, -0.311004243f, 0.0f // bottom right }; // Set color with red, green, blue and alpha (opacity) values float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f }; public Triangle() { // initialize vertex byte buffer for shape coordinates ByteBuffer bb = ByteBuffer.allocateDirect( // (number of coordinate values * 4 bytes per float) triangleCoords.length * 4); // use the device hardware's native byte order bb.order(ByteOrder.nativeOrder()); // create a floating point buffer from the ByteBuffer vertexBuffer = bb.asFloatBuffer(); // add the coordinates to the FloatBuffer vertexBuffer.put(triangleCoords); // set the buffer to read the first coordinate vertexBuffer.position(0); } } |
OpenGL ES定义了以下的默认坐标系统:[0,0,0] (X,Y,Z)作为GLSurfaceView图像的中点,[1,1,0]是图像的右上角顶点,[-1,-1,0]是左下角顶点。如果需要该坐标系统的图片,请移步OpenGL ES开发指南。 请注意,图形的坐标是按逆时针方向定义的,绘制的顺序是非常重要的,因为它定义图形的正面以及反面,正面可以被直接绘制,而反面你可能选择以OpenGL ES消除面方法使其不被绘制出来。想要获取更多关于面与消除的信息,请查看OpenGL ES开发指南。
在OpenGL中,定义三角形是非常简单的,但你是否想要来点高难度的?比如,方形?要定义方形,有很多种方法,其中典型的方法就是把两个三角形画在一起:
图1.使用两个三角形绘制方形
同样,你需要按照逆时针方向定义代表方形的两个三角形的坐标顶点,并把值写到ByteBuffer。为了避免每个三角形都定义坐标产生两种坐标系统,使用绘制列表告诉OpenGL ES图像管道如何绘制这些顶点,下面是该种形状绘制方法的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
class Square { private FloatBuffer vertexBuffer; private ShortBuffer drawListBuffer; // number of coordinates per vertex in this array static final int COORDS_PER_VERTEX = 3; static float squareCoords[] = { -0.5f, 0.5f, 0.0f, // top left -0.5f, -0.5f, 0.0f, // bottom left 0.5f, -0.5f, 0.0f, // bottom right 0.5f, 0.5f, 0.0f }; // top right private short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices public Square() { // initialize vertex byte buffer for shape coordinates ByteBuffer bb = ByteBuffer.allocateDirect( // (# of coordinate values * 4 bytes per float) squareCoords.length * 4); bb.order(ByteOrder.nativeOrder()); vertexBuffer = bb.asFloatBuffer(); vertexBuffer.put(squareCoords); vertexBuffer.position(0); // initialize byte buffer for the draw list ByteBuffer dlb = ByteBuffer.allocateDirect( // (# of coordinate values * 2 bytes per short) drawOrder.length * 2); dlb.order(ByteOrder.nativeOrder()); drawListBuffer = dlb.asShortBuffer(); drawListBuffer.put(drawOrder); drawListBuffer.position(0); } } |
这个例子给你展示如何使用OpenGL绘制更复杂的形状。一般来说,都是使用好几个三角形来绘制图形对象。在下节课,你将学习如何把这些图像画在屏幕上。
网页标题:如何使用OpenGL绘制更复杂的形状
URL链接:http://www.gawzjz.com/qtweb2/news43/18743.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联