Android OpenGL ES2.0编程教程系列之绘制图形(三)

35 篇文章 0 订阅
8 篇文章 0 订阅

原文链接

定义好想要用OpenGL绘制的图形后,你大概想要画它们了。绘制形状可能需要比你想象的更多的代码,因为API提供了在图形渲染管线上的大量的控制。

本节内容讲解如何使用OpenGL ES 2.0 API来绘制你在上节内容中定义的形状。

初始化形状

在任何绘制之前,你都必须初始化和加载你计划绘制的图形。除非你在程序中使用的形状的结构(原始坐标)是在程序执行过程中改变的,你应该在你的渲染器的onSurfaceCreated()方法中初始化它们来提高内存和执行的效率。

public class MyGLRenderer implements GLSurfaceView.Renderer {

    ...
    private Triangle mTriangle;
    private Square   mSquare;

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        ...

        // initialize a triangle
        mTriangle = new Triangle();
        // initialize a square
        mSquare = new Square();
    }
    ...
}
绘制形状
OpenGL ES 2.0绘制定义的形状需要大量有效的代码,因为你必须给图形渲染管线提供大量的细节。特别地,你需要定义以下几个内容:

  • Vertex Shader -—渲染形状定点的OpenGL ES图形代码
  • Fragment Shader—用颜色或纹理渲染形状的面的OpenGL ES代码
  • Program—包含你想用来绘制一个或多个形状的着色器的一个OpenGL ES 对象

你至少需要一个定点着色器去绘制形状和一个片元着色器去个这些形状上色。这些着色器必须先编译然后添加到用于绘制形状的OpenGL ES程序中。下面是一个教你怎样定义一个可以绘制形状的基本着色器的例程。在三角形类中:

public class Triangle {

    private final String vertexShaderCode =
        "attribute vec4 vPosition;" +
        "void main() {" +
        "  gl_Position = vPosition;" +
        "}";

    private final String fragmentShaderCode =
        "precision mediump float;" +
        "uniform vec4 vColor;" +
        "void main() {" +
        "  gl_FragColor = vColor;" +
        "}";

    ...
}

着色器包含OpenGL shading语言代码,这些代码在OpenGL ES环境中使用前必须先编译。在你的渲染器类中创建一个工具类方法来编译这些shader代码。

public static int loadShader(int type, String shaderCode){

    // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
    // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
    int shader = GLES20.glCreateShader(type);

    // add the source code to the shader and compile it
    GLES20.glShaderSource(shader, shaderCode);
    GLES20.glCompileShader(shader);

    return shader;
}
为了绘制形状,你必须编译shader代码,并将它们添加到 OpenGL ES程序对象中,然后链接它们。在你的绘制对象的构造器中做这件事,因此它会只执行一次。

注意:的编译shader代码和链接程序是很耗CPU资源和处理时间的,

public class Triangle() {
    ...

    private final int mProgram;

    public Triangle() {
        ...

        int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER,
                                        vertexShaderCode);
        int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER,
                                        fragmentShaderCode);

        // create empty OpenGL ES Program
        mProgram = GLES20.glCreateProgram();

        // add the vertex shader to program
        GLES20.glAttachShader(mProgram, vertexShader);

        // add the fragment shader to program
        GLES20.glAttachShader(mProgram, fragmentShader);

        // creates OpenGL ES program executables
        GLES20.glLinkProgram(mProgram);
    }
}
</pre><p></p><p><span style="font-size:14px">此时此刻你准备添加一个真实的调用来绘制你的形状。用OpenGL ES绘制形状需要你指定几个参数,来告诉渲染管线你想画什么,以及怎么画他们由于绘制的选项会由于形状的不同而不同,因此让你的形状类包含他们自己的绘制逻辑是个好主意。</span></p><p><span style="font-size:14px">创建draw()方法来绘制形状,下面的代码是给形状的顶点着色器和片元着色器来设置位置值和颜色值。,然后执行绘制功能:</span></p><p><span style="font-size:14px"></span></p><pre code_snippet_id="1700364" snippet_file_name="blog_20160529_6_9844018" name="code" class="java">private int mPositionHandle;
private int mColorHandle;

private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex

public void draw() {
    // Add program to OpenGL ES environment
    GLES20.glUseProgram(mProgram);

    // get handle to vertex shader's vPosition member
    mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

    // Enable a handle to the triangle vertices
    GLES20.glEnableVertexAttribArray(mPositionHandle);

    // Prepare the triangle coordinate data
    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
                                 GLES20.GL_FLOAT, false,
                                 vertexStride, vertexBuffer);

    // get handle to fragment shader's vColor member
    mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");

    // Set color for drawing the triangle
    GLES20.glUniform4fv(mColorHandle, 1, color, 0);

    // Draw the triangle
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);

    // Disable vertex array
    GLES20.glDisableVertexAttribArray(mPositionHandle);
}
一旦你有了这些代码,你只要在onFrameDraw()方法中调用draw()方法便可绘制你的形状了。
public void onDrawFrame(GL10 unused) {
    ...

    mTriangle.draw();
}
当你运行应用程序是它应该看起来像下面这个样子:


图1、没有用投影和相机视图绘制的三角形

这个例子中的代码有些小问题。首先,它无法给你的朋友留下深刻印象;第二,这个三角形有点被压扁了,而且当你改变屏幕方向时形状会变形。形状变形的原因是绘制对象的顶点没有针对GLSurfaceView显示的屏幕区域的屏幕比例做修正。你可以用下一节课程中的投影和相机视图来修复这些问题。

最后这个三角形是固定不动的,这有些无聊。不过在“添加动作”的课程中,你可以让它旋转,并且可以用OpenGL图形管线来做更多有趣的东西。


例程源码下载



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《OpenGL ES 2.0编程指南》是一本介绍OpenGL ES 2.0的编程技术和方法的指南。OpenGL ES(OpenGL for Embedded Systems)是一套专为嵌入式系统和移动设备设计的2D和3D图形API,而OpenGL ES 2.0是其中的版本之一。 这本指南首先介绍了OpenGL ES 2.0编程的基础知识,包括OpenGL ES的特性和架构,以及基本的绘制流程。然后,它详细介绍了OpenGL ES 2.0的着色器编程,包括顶点着色器和片段着色器。着色器编程OpenGL ES 2.0的核心,通过编写和使用着色器代码,开发者可以灵活地控制和定制图形渲染的各个环节。 此外,该指南还介绍了OpenGL ES 2.0的纹理映射、混合、剪裁和光照等高级技术。纹理映射可以让开发者在场景中添加细节和图案,混合可以实现透明效果,剪裁可以限制绘制的区域,光照可以增强场景的真实感。 《OpenGL ES 2.0编程指南》还提供了丰富的实例代码和实践案例,让读者能够通过实际操作深入理解OpenGL ES 2.0的编程方法和技巧。通过学习和掌握本书的内容,读者可以成为一名优秀的OpenGL ES 2.0开发者,能够开发出高性能、高质量的嵌入式图形应用程序。 总之,《OpenGL ES 2.0编程指南》是一本权威、全面且具有实践性的指南,对想要学习和应用OpenGL ES 2.0的开发者来说是一本非常有价值的参考书。 ### 回答2: 《OpenGLES2.0编程指南》是一本介绍OpenGL ES 2.0编程的指南书籍。OpenGL ES是一种针对移动设备和嵌入式系统的图形库,而OpenGL ES 2.0是其最新版本,提供了强大的图形渲染功能和灵活的编程接口。 这本书以深入浅出的方式介绍了OpenGL ES 2.0的基本概念、渲染管线、顶点和片元着色器、纹理映射、渲染缓冲区和帧缓冲区等核心知识。读者可以通过学习本书,了解到如何利用OpenGL ES 2.0编写高性能的图形应用程序。 在《OpenGLES2.0编程指南》中,作者还会通过大量的示例代码来演示如何使用OpenGL ES 2.0进行图形渲染。这些示例代码会涉及到常用的图形渲染技术,如图元绘制、光照、投影变换、深度测试等。读者可以通过对这些示例代码的学习和分析,更好地理解OpenGL ES 2.0的编程思想和技术要点。 此外,本书还介绍了一些常见的图形效果和优化技巧,如阴影、反射和抗锯齿等。这些内容对于那些希望提升图形应用程序性能和效果的开发者来说十分有用。 总的来说,《OpenGLES2.0编程指南》是一本全面而深入的OpenGL ES 2.0编程教材,适合那些想要学习OpenGL ES 2.0编程或者提升自己OpenGL ES 2.0编程技能的开发者阅读。通过学习本书,读者可以掌握OpenGL ES 2.0的基本知识和相关的编程技术,进一步提高自己在图形应用开发领域的水平。 ### 回答3: 《OpenGL ES 2.0编程指南》是一本深入解析OpenGL ES 2.0编程的指南。OpenGL ES(OpenGL for Embedded Systems)是为嵌入式设备和移动设备设计的精简版OpenGL。这本指南主要面向对OpenGL ES 2.0编程感兴趣的开发人员。 本书首先介绍了OpenGL ES 2.0的基本概念和工作原理。接着详细讲解了OpenGL ES 2.0的渲染管线、着色器语言以及顶点和片元着色器的编程。书中还提供了大量的示例代码和实践案例,帮助读者更好地理解各种概念和技术,并应用于实际项目中。 《OpenGL ES 2.0编程指南》还涵盖了纹理映射、深度缓冲、帧缓冲和多重渲染目标等高级主题。读者可以学习到如何使用这些高级功能实现更加复杂的图形效果。此外,书中还介绍了一些优化技巧和调试方法,帮助开发人员提高应用性能并排除错误。 这本指南对于初学者来说可能会有一些挑战,因为OpenGL ES 2.0的编程相对复杂。但对于有一定OpenGL基础的开发人员来说,它是一本非常有价值的参考书。作为一本权威的OpenGL ES 2.0编程指南,它提供了丰富的知识和实践经验,可以帮助读者掌握这一领域的核心技术和开发流程。 综上所述,《OpenGL ES 2.0编程指南》是一本深入介绍和解析OpenGL ES 2.0编程的权威指南。无论是初学者还是有经验的开发人员,都可以通过阅读这本书来学习和应用OpenGL ES 2.0的编程技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值