第二章 你好三角形:一个OpenGL ES 2.0例子

介绍基本概念的OpenGL ES 2.0,我们首先从一个简单的例子。在这一章里,我们将展示什么是需要创建一个OpenGL ES 2.0一个三角形的项目、。我们要编写的程序是最基本的例子,一个OpenGL
ES 2.0应用程序,绘制几何。有数量的概念,我们将介绍在本章:

1.创建一个屏幕渲染表面与EGL。

2.加载片段着色器和定点。

3.创建程序的对象,附着顶点和片段着色器,连接程序对象。

4.设置窗口。

5.清除颜色缓冲。

6.渲染一个简单的例子。

7.使内容的颜色缓冲可见在EGL窗口表面。

事实证明,我们可以开始画一个三角形之前,有相当数量的步骤需要做。这个章节将涵盖的每一个步骤。在您的书中,我们补充了每个步骤的细节和进一步的文档API。我们的目的是让你运行你的第一个简单的例子,让您了解如何创建一个应用程序与OpenGL
ES 2.0。

Code Framework    代码框架

在本书中,我们将构建一个图书馆的实用工具函数,形成一个框架有用的功能,以编写OpenGL
ES 2.0 程序。为了发展示例程序,我们有几个目标,这段代码框架:

1。它是简单的,小的,容易理解。我们希望把我们的例子在相关的OpenGL ES 2.0调用,而不是在一个大型的我们所方明的代码框架。相反,我们尽力事我们的示例程序易于读和理解。这个框架的目的是为了让你集中精力在每个示例的重要的OpenGL ES 2.0 API概念。

2。它可以移植。尽管我们开发我们的示例程序在使用微软的Windows操作系统,我们想要的样本程序容易地移植到其他操作系统和环境。此外,我们选择使用C语言而不是c++,由于不同的c++的局限在许多手持平台。我们也避免使用全局数据,由于他它不允许在许多手持平台使用。

当我们阅读本书的例子,我们引用一些新的代码框架函数。此外,你可以在附录d找到完整的代码文档。你看到的示例代码中任何函数,任何以es开头的函数是我们写的代码框架的一部分。

Where to Download the Examples    哪里下载例子

您可以下载示例从这本书网站在www.opengles-book.com。

这个例子都是针对运行在微软Windows XP或Vista MicrosoftWindows与桌面图形处理单元(GPU)支持OpenGL 2.0。示例程序以源代码的形式提供、 Visual Studio 2005项目的解决方案。这个例子构建和运行在AMD的OpenGL ES 2.0模拟器。一些高级在这本书的渲染例子是用RenderMonkey实现,一个材质developmenttool从AMD。这本书网站提供链接在何处downloadany所需的工具。OpenGL ES 2.0的模拟器和RenderMonkeyare都免费提供的工具。读者没有自己的Visual
Studio,可以免费获得微软Visual Studio 2008 Express Edition,在 www.microsoft.com/express/ for download。

Hello Triangle Example    你好三角形例子

让我们看看我们的完整源代码示例项目-你好三角形,这是2 - 1中列出的例子。对于那些熟悉固定功能的桌面版本OpenGL的读者,你可能会认为这是一个一堆代码只是为了画一个简单的三角形。对于那些不熟悉的桌面OpenGL的人,你可能也会认为这是一个很多代码只是为了画一个三角形!记住,OpenGL
ES 2.0是完全基于着色器的,这意味着你在没有适当的着色加载和边框的情况下,你不能画任何图形。这意味着相比较桌面版的openGL使用固定的函数处理,你需要使用更多的需要渲染的代码。

Example 2-1Hello
Triangle Example    

#include "esUtil.h"
typedef struct
{
// Handle to a program object GLuint programObject;
} UserData;
///
// Create a shader object, load the shader source, and // compile the shader.
//
GLuint LoadShader(const char *shaderSrc, GLenum type) {
GLuint shader; GLint compiled;
// Create the shader object shader = glCreateShader(type);
   if(shader == 0)
      return 0;
// Load the shader source glShaderSource(shader, 1, &shaderSrc, NULL);
// Compile the shader glCompileShader(shader);
// Check the compile status
glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);

if(!compiled) {
GLint infoLen = 0;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
      if(infoLen > 1)
      {
char* infoLog = malloc(sizeof(char) * infoLen);
glGetShaderInfoLog(shader, infoLen, NULL, infoLog); esLogMessage("Error compiling shader:\n%s\n", infoLog); free(infoLog);
}
glDeleteShader(shader);
return 0; }
return shader; }
///
// Initialize the shader and program object //
int Init(ESContext *esContext)
{
UserData *userData = esContext->userData; GLbyte vShaderStr[] =
"attribute vec4 vPosition; "void main()
"{
" gl_Position = vPosition; "}
\n"
\n"
\n"
\n"
\n";
GLbyte fShaderStr[] =
"precision mediump float;
"void main()
"{
" gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); \n" "} \n";
GLuint vertexShader; GLuint fragmentShader; GLuint programObject; GLint linked;
// Load the vertex/fragment shaders
vertexShader = LoadShader(GL_VERTEX_SHADER, vShaderStr); fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fShaderStr);
// Create the program object programObject = glCreateProgram();
if(programObject == 0) return 0;
glAttachShader(programObject, vertexShader); glAttachShader(programObject, fragmentShader);
// Bind vPosition to attribute 0 glBindAttribLocation(programObject, 0, "vPosition");
// Link the program glLinkProgram(programObject);
// Check the link status
glGetProgramiv(programObject, GL_LINK_STATUS, &linked);
   if(!linked)
   {
GLint infoLen = 0;
glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &infoLen);
      if(infoLen > 1)
      {
char* infoLog = malloc(sizeof(char) * infoLen);
glGetProgramInfoLog(programObject, infoLen, NULL, infoLog); esLogMessage("Error linking program:\n%s\n", infoLog);
free(infoLog); }
glDeleteProgram(programObject);
      return FALSE;
   }
// Store the program object userData->programObject = programObject;
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
   return TRUE;
}
//
// Draw a triangle using the shader pair created in Init() //
void Draw(ESContext *esContext)
{
UserData *userData = esContext->userData; GLfloat vVertices[] = {0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f};
// Set the viewport
glViewport(0, 0, esContext->width, esContext->height);
// Clear the color buffer glClear(GL_COLOR_BUFFER_BIT);
// Use the program object glUseProgram(userData->programObject);
// Load the vertex data
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices); glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);
eglSwapBuffers(esContext->eglDisplay, esContext->eglSurface); }
int main(int argc, char *argv[]) {
ESContext esContext; UserData userData;
esInitialize(&esContext); esContext.userData = &userData;
esCreateWindow(&esContext, "Hello Triangle", 320, 240, ES_WINDOW_RGB);
if(!Init(&esContext)) return 0;
esRegisterDrawFunc(&esContext, Draw);
esMainLoop(&esContext); }

Building and Running the Examples    编译和运行例子

在这本书中所有的示例程序开发全部都在AMD’sOpenGL ES 2.0模拟器的上层运行。这个模拟器提供了一个运行EGL 1.3和OpenGL ES 2.0 api的窗口。标准GL2和EGL的头文件是被Khronos提供的,它曾经被作为模拟器的接口  。模拟器是一个完全可以运行OpenGL
ES 2.0,这意味着在模拟器上编写的绘图代码可以无缝地在真机上运行。注意,模拟器要求您拥有一个支持桌面OpenGL 2.0 API的桌面GPU。

我们设计的代码框架,可以移植到多种平台。但是,为了这本书的所有示例都使用微软Visual Studio 2005。OpenGL ES 2.0的例子——都在以下的文件夹里:

Common/—包括 OpenGL ES 2.0框架项目,代码.

Chapter_X/—包括每章的代码。 每一章VisualStudio 2005 的启动项.

为了运行你好三角形的例子。请打开Chapter_2/Hello_Triangle/Hello_Triangle.sln in
Visual Studio 2005这个文件。这个程序可以直接用 Visual Studio 2005执行。运行起来你可以看到如表格2-1的这张图片。

请注意下另外提供的简单代码。本书后面提供的很多例子用的是AMD的免费着色开发工具RenderMonkey1.80v.RenderMonkey使用在我们应该仅仅注意着色器代码的例子种。RenderMonkey对于开发着色效果提供了一个非常灵活的继承开发环境。所有后缀是.rfx的例子可以用 RenderMonkey
v1.80进行开发。 RenderMonkey v1.80IDE 使用的效果截图在Color Plate 2种可以看见。

Using the OpenGL ES 2.0 Framework     用openGLES 2.0框架

在你好三角形的主函数里面,你可以看见很多的调用ESutility的函数。主函数的第一件事情是声明一个 ESContext并且初始化它。

ESContext esContext;UserData userData;

esInitialize(&esContext);esContext.userData = &userData; 

这本书里的每一个例子都在做同样的事情。ESContextis包含了ES框架所需要的所有程序的必要信息,并且ES框架工具函数都会传递给它。因为是一个简单的程序,所以所有的传递都围绕这context,ES框架不需要全局变量。

许多的掌上设备平台不允许程序声明全局静态变量。例如BREW和塞班。正因如此我们避免在例子种或者在框架种在两个函数传递context的时候,代码中声明全局变量。

ESContext有一个空指针类的成员变量userData。每个程序例子将会在user data中存储应用所需要的数据。

The ESContext
has a member variable named
userData
that is a void*.Each of the sample programs will store any of
the data that are needed forthe application in userData.
The esInitialize
function is called by thesample program to initialize the context and the ES code framework. Theother elements in the
ESContext
structure are described in the header fileand are intended only to be read by the user application. Other data in theESContext
structure include information such as the window width andheight, EGL context, and callback function pointers. 

时间: 2024-08-31 03:15:41

第二章 你好三角形:一个OpenGL ES 2.0例子的相关文章

opengl es fbo-求一个opengl es 在android上用 FBO的demo

问题描述 求一个opengl es 在android上用 FBO的demo 如题,最近需要做这个项目,在网上找了很久也找不到es的FBO例子,困在这里好久了,请高人拉我一把! 我需要c++版本的 解决方案 http://www.cnblogs.com/mengdd/archive/2013/05/02/3055649.html 解决方案二: http://blog.sina.com.cn/s/blog_4062094e0100alvv.html 解决方案三: 找了一些看看有没有符合要求的 And

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——1.6节本章小结

1.6 本章小结 Android 3D游戏开发技术宝典--OpenGL ES 2.0 本章主要分为5个部分,分别介绍了手机市场的现状.Android平台的特点及未来的趋势.如何搭建Android开发环境.如何开发Hello Android应用程序.如何调试Android应用程序以及Android应用程序的运行机制.通过阅读本章,读者应该对当下的手机产业有个大概的了解,初步掌握Android相关的环境变量配置,简单程序的开发与调试,并且对Android应用程序的运行机制有大概的了解.

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.8节本章小结

2.8 本章小结Android 3D游戏开发技术宝典--OpenGL ES 2.0本章主要对Android平台下游戏开发中可能会用到的Android平台的相关基础知识进行了详细介绍,如文件的I/O操作.SQLite数据库的增.删.改.查,游戏中声音特效.蓝牙互联等.只有学好这些基础知识,开发人员才能开发出更好的Android手机游戏.读者一定要在这些基础上面下足了工夫,今后的开发道路才会一帆风顺. 提示 Android平台的其他相关知识还有很多,由于本书侧重于介绍OpenGL ES 2.0 3D

《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》——6.4节点法向量和面法向量

6.4 点法向量和面法向量 OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例 本章前面几节的案例都是基于球面开发的,球面属于连续.平滑的曲面,因此面上的每个顶点都有确定的法向量.但现实世界中的物体表面并不都是连续.平滑的,此时对于面上的某些点的法向量计算就不那么直观了,图6-18说明了这个问题. 从图6-18中可以看出,顶点A位于长方体左.上.前3个面的交界处,此处是不光滑的.这种情况下顶点A的法向量有两种处理策略,具体如下所列. 在顶点A的位置放置3个不同的顶点,每个顶点看作是仅

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.1节游戏中的音效

2.1 游戏中的音效 Android 3D游戏开发技术宝典--OpenGL ES 2.0 一款好游戏,除了具备优质的画面和较高的可玩性之外,还应该有出色的音效.音效一般指的是游戏中发生特定行为或进行特定操作时播放的效果音乐或为了渲染整体气氛播放的背景音,如远处隆隆的炮声.怪物死亡的惨叫声.由远而近的脚步声等. 通过开发人员精心准备的声音特效,结合游戏的场景,可以渲染出一种紧张刺激的氛围,使玩家产生身临其境的感觉.这就像电影中的声音特效一样,假如没有了合适的音效,那么游戏和电影一样,真实感会大打折

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.5节2D动画的开发

2.5 2D动画的开发 Android 3D游戏开发技术宝典--OpenGL ES 2.0 虽然本书是着重介绍3D的开发技术,但在大部分的3D应用中也需要有不少的2D界面,如菜单.帮助等.本节将介绍一般用于开发游戏中2D界面的SurfaceView类的使用.其继承自View类,但与View的不同之处在于,View更新画面必须是在UI线程中(也可以理解为主线程中),而SurfaceView更新画面可以在自定义线程中进行,大大方便了开发. 提示 关于Android下的多线程问题,读者可以参考笔者在人

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.3节手机自带数据库——SQLite

2.3 手机自带数据库--SQLiteAndroid 3D游戏开发技术宝典--OpenGL ES 2.0上一节介绍了如何使用Preferences存储简单数据,而复杂的数据就需要存储到文件或数据库中了. Android自带了一款轻量级的关系数据库--SQLite,其具有体积小,功能强大等诸多特点,成为嵌入式设备首选的数据库系统.本节将带领读者走进SQLite的世界,去学习如何应用SQLite数据库进行数据的增.删.改.查等基本操作. 2.3.1 初识SQLiteSQLite是一款满足ACID特性

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.4节文件I/O

2.4 文件I/OAndroid 3D游戏开发技术宝典--OpenGL ES 2.0I/O即输入与输出,几乎所有文件操作的工作都离不开I/O.对于Android游戏开发来说,I/O操作尤为重要,游戏中的地图数据.人物图片资源等的流畅读取是保证游戏可玩性的重要方面.因此在开发时,不同的场合必须选用合适的I/O操作方式,才能保证满足用户的需求. Android中文件I/O分为3种方式:SD卡文件读取.手机中文件夹的访问和应用程序中Assets文件的读取,本节将结合简单的小案例对这几种文件I/O操作进

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——1.5节Android应用程序运行的机制

1.5 Android应用程序运行的机制 Android 3D游戏开发技术宝典--OpenGL ES 2.0 上一节介绍了如何搭建Android开发环境.如何开发Hello Android应用程序以及Android应用程序的调试,接下来在本节中将简要地介绍Android应用程序的运行机制. 1.5.1 应用程序的系统架构 Android平台由应用程序.应用程序框架.Android运行时.系统库以及底层Linux内核构成,详细结构如图1-54所示. 说明 应用程序层里面包含的就是需要读者去发挥创意