Cocos2dx中的opengl使用(一)简单介绍

  引擎提供了CCGLProgram类来处理着色器相关操作,对当前绘图程序进行了封装,其中使用频率最高的应该是获取着色器程序的接口:const GLuint getProgram();

该接口返回了当前着色器程序的标识符。后面将会看到,在操作OpenGL的时候,我们常常需要针对不同的着色器程序作设置。注意,这里返回的是一个无符号整型的标识符,而不是一个指针或结构引用,这是OpenGL接口的一个风格。对象(纹理、着色器程序或其他非标准类型)都是使用整型标识符来表示的。

CCGLProgram提供了两个函数导入着色器程序,支持直接从内存的字符串流载入或是从文件中读取。这两个函数的第一个参数均指定了顶点着色器,后一个参数则指定了像素着色器:

[cpp] view plaincopy

  1. /** Initializes the CCGLProgram with a vertex and fragment with bytes array */
  2. bool initWithVertexShaderByteArray(const GLchar* vShaderByteArray, const GLchar* fShaderByteArray);
  3. /** Initializes the CCGLProgram with a vertex and fragment with contents of filenames */
  4. bool initWithVertexShaderFilename(const char* vShaderFilename, const char* fShaderFilename);

仅仅加载肯定是不够的,我们还需要给着色器传递运行时必要的输入数据。在着色器中存在两种输入数据,分别被标识为attribute和uniform。

attribute变量是应用程序直接传递给顶点着色器的变量,在段着色器中不能访问。它描述的是每个顶点的属性,如位置、法线等,被限制为向量或标量这样的简单结构。必须为每个顶点指定对应的值,这类似于C中的函数参数。

uniform变量是全局性的,可以同时在顶点着色器和段着色器中访问。在整个渲染流水线中,每个uniform变量都是唯一的,不存在每个像素或顶点需要单独定义的问题,这一点是和C的全局变量类似的。uniform变量的可定义类型会更丰富一些,还可以包括纹理矩阵和纹理,甚至可以通过uniform block自定义复杂的数据类型。

uniform变量是全局性的,可以同时在顶点着色器和段着色器中访问。在整个渲染流水线中,每个uniform变量都是唯一的,不存在每个像素或顶点需要单独定义的问题,这一点是和C的全局变量类似的。uniform变量的可定义类型会更丰富一些,还可以包括纹理矩阵和纹理,甚至可以通过uniform block自定义复杂的数据类型。

int glGetUniformLocation(GLuint program, const GLchar* name);

对uniform变量的设置存在着一系列以"glUniform"为前缀的函数,这些函数的第一个参数为需要设置的参数标识,后面跟若干参数值.

shader配置文件 .vsh  和 .fsh

initWithVertexShaderFilename(const char* vShaderFilename, const char* fShaderFilename)     这里我们可以用到shader配置文件 .vsh  和 .fsh

可以参考quick-lua3.3 quick\lib\quick-src\extra\filters\shader目录下的部分例子,如

example_MultiTexture.vsh:

attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;

#ifdef GL_ES
varying lowp vec4 v_fragmentColor;
varying mediump vec2 v_texCoord;
#else
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
#endif

void main()
{
    gl_Position = CC_PMatrix * a_position;
    v_fragmentColor = a_color;
    v_texCoord = a_texCoord;
}

example_MultiTexture.fsh:

#ifdef GL_ES
precision mediump float;
#endif

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;

uniform sampler2D u_texture1;
uniform float u_interpolate;

void main() {
    vec4 color1 = texture2D(CC_Texture0, v_texCoord);
    vec4 color2 = texture2D(u_texture1, v_texCoord);
    gl_FragColor = v_fragmentColor * mix( color1, color2, u_interpolate);
}

http://www.58player.com/blog-2534-93050.html

使用例子:http://www.cnblogs.com/U-tansuo/p/quick2-25_shader.html

http://4gamers.cn/blog/categories/opengl-es/

时间: 2024-10-08 04:12:55

Cocos2dx中的opengl使用(一)简单介绍的相关文章

java中equals以及==的用法(简单介绍)

简单介绍 equals方法是java.lang.Object类的方法 有两种用法说明: 一.对于字符串变量来说,使用"=="和"equals()"方法比较字符串时,其比较方法不同. 1."=="比较两个变量本身的值,即两个对象在内存中的首地址. (java中,对象的首地址是它在内存中存放的起始地址,它后面的地址是用来存放它所包含的各个属性的地址,所以内存中会用多个内存块来存放对象的各个参数,而通过这个首地址就可以找到该对象,进而可以找到该对象的各

网络测量中基于Sketch方法的简单介绍

Sketch介绍 为什么要用Sketch 网络流主要根据五元组.主机地址.包的大小来分类.在网络中存在各种各样的包,如果按照上述分类方法,对每一种包都分配一个计数器来储存,虽然测量准确,那么存放计数器的空间开销会非常大.所以使用哈希的方法,根据哈希值的范围来确定的所需的存储空间,各种包根据哈希值再次归类,可以大大减少存储空间.这样使用哈希来估计流的方法称为Sketch-based方法. Count-min sketch 如何处理包 使用哈希的方法会产生冲突,多个种类的包哈希到同一个桶内,那么这个

Cocos2d-x中Vector<T>容器以及实例介绍

Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容纳的是Ref及子类所创建的对象指针,其中的T是模板,表示能够放入到容器中的类型,在Cocos2d-x 3.x中T表示Ref类.Vector<T>是模仿C++的std::vector<T>模板类而设计的.在内存管理方面不使用__Array的引用计数,它的内存管理是由编译器自动处理的,可以不用考虑内存释放问题.Vector<T>的性能优于__Array类,Coco2d-x官方将Vecto

一些在PHP网络编程中会遇到的函数简单介绍

PHP网络编程函数介绍 1.     Fgetcsv函数-解析读入的行并找出csv格式的字段. Fgetcsv函数可以解析读入的行并找出csv格式的字段,然后返回一个包含这些字段的数组. Fgetcsv()函数参数的说明: 参数 说明 Handle 必选参数.打开文件后返回文件标识指针 Length 必选参数.指定一行最多显示的字符数,该值大于csv文件最长行的字符数. Delimiter 可选参数.文件的分隔符 Enclosure 可选参数.文件的分隔符 [示例]获取文件中每行用逗号分隔后所获

NDk中android.mk文件的简单介绍

先贴一个样例,然后解释一下: 1 LOCAL_PATH:= $(call my-dir) 2 include $(CLEAR_VARS) 3 LOCAL_MODULE := mydjvuapi 4 SRC_FILE_OF_MINE := 5 classify.cpp 6 cuts.cpp \ 7 INCLUDES_FILE_OF_MINE:= \ 8 $(LOCAL_PATH)/../myjpeginterface 9 $(LOCAL_PATH)/../mytiffinterface10 STA

(转)CSS与JS中的相对路径引用简单介绍

javascript和css文件中采用相对路径,其基准路径是完全不同的. 1.javascript引用资源(比如图片)相对路径是以宿主路径(被引用的网页比如你在首页index.php引用了某js文件,则index.php即为宿主)所处位置为基准. 2.css引用资源(比如图片)相对路径是以.css文件所处位置为基准! 大家在html中通常会导入一些外部的css.js文件,而其中一个比较容易被忽视的问题就是路径问题,有时候,我们在css.js中都有通过路径来引入一张图片的需求,当我们采用相对路径的

Linux 中 vi / vim 编辑器的简单介绍后续增加强大的功能

vi/vim编辑器 一般模式:光标移动,复制整行粘贴行,搜索替换,删除字符,删除列等 移动光标的方法 h 或 向左箭头键(←) 光标向左移动一个字符 j 或 向下箭头键(↓) 光标向下移动一个字符 k 或 向上箭头键(↑) 光标向上移动一个字符 l 或 向右箭头键(→) 光标向右移动一个字符 如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标. 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" 或 "30↓&

HTML5中的localStorage与sessionStorage简单介绍

HTML 5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前,这些都是由 cookie 完成的.但是 cookie 不适合大量数据的存储,因为它们由每个对服务器的请求来传递,这使得 cookie 速度很慢而且效率也不高. 在 HTML 5 中,数据不是由每个服务器请求传递的,而是只有在请求时使用数据.它使在不影响网站性能的情况下存储大量数据成为可能. 对于不同的网站,数据存储

DrawCall的简单介绍

Unity每次在准备数据并通知GPU渲染的过程称为一次Draw Call. 一般情况下,渲染一次拥有一个网格并携带一种材质的物体便会使用一次Draw Call. 对于渲染场景中的这些物体,在每一次Draw Call中除了在通知GPU的渲染上比较耗时之外,切换材质与shader也是非常耗时的操作. Draw Call的次数是决定性能比较重要的指标. 对于IOS平台上来说,Draw Call应该控制在20此以内,这个值可以在Game视图窗口中的Statistic面板中查看. DrawCall的简单介