着色器对象和程序对象是使用着色器渲染的2种基本的对象类型。一个着色器对象可以当做是一个C编译器,而程序对象作为连接器。一个编译器生成目标代码(如.OBJ,.o文件),对象文件完成创建后,C连接器将该对象文件链接到最后程序。一个程序需要链接一个顶点着色器和片段着色器。

  一般进程获取一个链接的着色器对象包括6个步骤

  1.创建顶点着色器和片段着色器

  2.将源码附加在每个着色器对象中

  3.编译着色器对象

  4.创建程序对象

  5.将编译的着色器对象附加到程序对象中

  6.链接程序对象

如果链接成功,我们就可以随时绘制。下面详细介绍执行这些进程的API

  1.创建并编译着色器

  GLuint glCreareShader(GLenum type)  type

  着色器类型【GL_VERTEX_SHADER,GL_FRAGMENT_SHADER】

  返回对象为新着色器对象的句柄

  void glDeleteShader(GLuint shader)

   shader 删除该着色器对象(如果一个着色器对象在删除前已经链接到程序对象中,那么当执行glDeleteShader函数时不会立即被删除,而是该着色器对象将被标记为删除,器内存被释放一次,它不再链接到其他任何程序对象)。

  void glShaderSource(GLuint shader,GLsizei count,const GLchar * const*string,const GLint *length)

  glCompileShader(GLuint shader)  编译着色器对象

  glGetShaderiv(GLuint shader,GLenum pname,GLint *params)

   pname  【GL_COMPILE_STATUS  GL_DELETE_STATUS  GL_INFO_LOG_LENGTH  GL_SHADER_SOURCE_LENGTH  GL_SHADER_TYPE】

  返回编译信息,YES表示编译成功,NO失败

GLuint LoadShader ( GLenum type, const char *shaderSrc )
{
GLuint shader;
GLint compiled;
shader = glCreateShader ( type ); if ( shader == )
{
return ;
} glShaderSource ( shader, , &shaderSrc, NULL );
glCompileShader ( shader );
glGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled );
if ( !compiled )
{
GLint infoLen = ;
glGetShaderiv ( shader, GL_INFO_LOG_LENGTH, &infoLen );
if ( infoLen > )
{
char* infoLog = malloc ( sizeof ( char ) * infoLen );
glGetShaderInfoLog ( shader, infoLen, NULL, infoLog );
esLogMessage(“Error compiling shader:\n%s\n”, infoLog);
free ( infoLog );
}
glDeleteShader ( shader );
return ;
} return shader;
}

2.创建连接一个程序

  program  GLuint glCreateProgram()

  删除一个程序

   GLuint glDeleteProgram(GLuint program)

  连接着色器到程序

  void glAttachShader(GLuint program, GLuint shader)

  取消连接

   void glDetachShader(GLuint program, GLuint shader)

  连接程序

   void glLinkProgram(GLuint program)

  日志信息

  void glGetProgramiv(GLuint program, GLenum pname,GLint *params)

  验证结果

  void glValidateProgram(GLuint program)  激活程序  void glUseProgram(GLuint program)

    programObject = glCreateProgram ( );
if ( programObject == )
{
return ;
}
glAttachShader ( programObject, vertexShader );
glAttachShader ( programObject, fragmentShader ); glLinkProgram ( programObject );
glGetProgramiv ( programObject, GL_LINK_STATUS, &linked );
if ( !linked )
{
GLint infoLen = ;
glGetProgramiv( programObject, GL_INFO_LOG_LENGTH, &infoLen);
if ( infoLen > )
{
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;
} glUseProgram ( programObject );

OpenGL ES 3.0之Shader and program(七)的更多相关文章

  1. 《OpenGL® ES™ 3.0 Programming Guide》读书笔记1 ----总览

    OpenGL ES 3.0 Graphics Pipeline OpenGL ES 3.0 Vertex Shader Transform feedback: Additionally, OpenGL ...

  2. OpenGL ES 2.0 Shader 调试新思路(二): 做一个可用的原型

    OpenGL ES 2.0 Shader 调试新思路(二): 做一个可用的原型 目录 背景介绍 请参考前文OpenGL ES 2.0 Shader 调试新思路(一): 改变提问方式 优化 ledCha ...

  3. OpenGL ES 2.0 Shader 调试新思路(一): 改变提问方式

    OpenGL ES 2.0 Shader 调试新思路(一): 改变提问方式 --是什么(答案是具体值) VS 是不是(答案是布尔值) 目录 背景介绍 问题描述 Codea 是 iPad 上的一款很方便 ...

  4. Beginning OpenGL ES 2.0 with GLKit Part 1

    Update 10/24/12: If you’d like a new version of this tutorial fully updated for iOS 6 and Xcode 4.5, ...

  5. 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数

    1.                 打开Eclipse,File-->New-->Project…-->Android-->AndroidApplication Projec ...

  6. 【Android 应用开发】OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解

    最近开始关注OpenGL ES 2.0 这是真正意义上的理解的第一个3D程序 , 从零开始学习 . 案例下载地址 : http://download.csdn.net/detail/han120201 ...

  7. OpenGL ES 3.0顶点着色器(一)

    OpenGL ES 3.0流程图 1.Vertex Shader(顶点着色器) 顶点着色实现了一种通用的可编程方法操作顶点. 顶点着色器的输入包括以下几个: • Shader program.程序的顶 ...

  8. OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解

    最近开始关注OpenGL ES 2.0 这是真正意义上的理解的第一个3D程序 , 从零开始学习 . 案例下载地址 : http://download.csdn.net/detail/han120201 ...

  9. 梳理 Opengl ES 3.0 (二)剖析一个GLSL程序

    OpenGL ES shading language 3.0 也被称作 GLSL,是个 C风格的编程语言. Opengl ES 3.0内部有两种可编程处理单元,即Vertex processor和Fr ...

随机推荐

  1. 爬虫IP被禁的简单解决方法

    爬虫以前听上去好厉害好神秘的样子,用好了可以成就像Google.百度这样的索索引擎,用不好可以凭借不恰当的高并发分分钟崩掉一个小型网站.写到这里想到12306每年扛住的并发请求量,觉得好牛逼. 爬虫和 ...

  2. 加快Qemu Aarch32虚拟开发板的启动速度

    软件版本 Qemu: 2.8.0 虚拟开发板: vexpress-ca9 概述 之前的博文介绍了将Python移植到开发板上, 根文件系统采用的是ramdisk, 这个文件系统的缺点是修改的内容重启会 ...

  3. lufylegend:Lbuttion等UI组件

    1,矩形按钮LButtonSample1 首先来看看LButtonSample1按钮的绘制. 在lufylegend.js引擎中可以利用LButton类来添加一个按钮,但是你需要传入按钮弹起和按钮按下 ...

  4. 实现iOS长时间后台的两种方法:Audiosession和VOIP

    http://www.cocoachina.com/applenews/devnews/2012/1212/5313.html 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在 ...

  5. AES加解密算法在Android中的应用及Android4.2以上版本调用问题

     from://http://blog.csdn.net/xinzheng_wang/article/details/9159969 AES加解密算法在Android中的应用及Android4.2以上 ...

  6. WordPress基础:wp_list_pages显示页面信息列表

    函数:wp_list_pages($args) 作用:列出某个分类下的分类项目 常见参数说明: 参数 用途  值   sort_column  排序方式 post_title 按标题排序 [默认] m ...

  7. Java POI 3.17写入、导入EXCEL性能测试

    我们先测试一下写入 50000 条 程序源码: 写入的excel文件信息 再看一下文件的结构 我们再次测试一下导入数据库的性能(用移动的网络上传至电信服务器): 在导入的过程中也可以中止导入行为: 上 ...

  8. epoll的两种工作模式

    epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在採用这两种模式时要注意的是,假设採用ET模式,那么仅当状态发生变化时才会通知,而採用L ...

  9. 【转】Android思维导图

    转自:http://www.open-open.com/lib/view/open1421201191375.html

  10. Android Studio导入项目的中文注释乱码解决方法

           在Android studio中,导入Android的项目后,容易出现项目文件的中文乱码,中文无法正常显示,变成了一些格子问号之类的,导致无法查看中文的注释,下面来看看导入项目和解决乱码 ...