第二章 你好三角形:一个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. 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值