一、本文关注的问题:

• Shader and program 对象介绍
•创建并编译一个Shader对象
• 创建并链接一个Program对象
• 获取并设置uniforms
• 获取并设置attributes

在OpenGL ES中,每个program对象有且仅有一个Vertex Shader对象和一个Fragment Shader对象连接到它。

Shader:类似于C编译器

Program:类似于C链接器

glLinkProgram操作产生最后的可执行程序,它包含最后可以在硬件上执行的硬件指令。

二、Shader和Program编程概述

1. 创建Shader
1)编写Vertex Shader和Fragment Shader源码。

2)创建两个shader 实例:gluint glCreateShader(GLenum type);

3)给Shader实例指定源码。 glShaderSource

4)在线编译shaer源码 void glCompileShader(gluint shader)

2. 创建Program

1)创建program gluint glCreateProgram(void)

2)绑定shader到program 。 void glAttachShader(gluint program,gluint shader)。每个program必须绑定一个Vertex Shader 和一个Fragment Shader。

3)链接program 。 void glLinkProgram(gluint program)

4)使用porgram 。 void gluseProgram(gluint program)

对于使用独立shader编译器编译的二进制shader代码,可使用glShaderBinary来加载到一个shader实例中。

三、Shading Language中的数据类型与变量
1. Uniforms and Attributes

Uniforms 是一个program 中统一分配的,vertext 和fragment中同名的Uniform必须同类型。对应于不经常变化的变量(用于存储只读常量值的变量)。

Attributes 变化率高的变量。主要用来定义输入的每个点属性。

Uniforms and Attributes 在shader中通过location 和 name 来对应的。

2. 数据类型

1)三类基本数据类型:float,int,boolean

2)复合类型浮点、整型、布尔向量 vec2,vec3,vec4。vector访问方式有以下两种:

(1).操作:数学{x,y,z,w},颜色{r,g,b,a}或 纹理坐标{s,t,r,q},但不能混用,举例如下:

vec3 myVec3 = vec3(0.0,1.0,2.0); // myVec3 = {0.0,2.0}
vec3 temp;
temp = myVec3.xyz; // temp = {0.0,2.0}
temp = myVec3.xxx; // temp = {0.0,0.0,0.0}
temp = myVec3.zyx; // temp = {2.0,0.0}

(2)[ ]操作:[0]对应x,[1]对应y,[2]对应z,[3]对应w。[ ]中只能为常量或uniform变量,不能为整数量变量(如:i,j,k)。

3)矩阵:mat2,mat3,mat4 (按顺序存储)

mat3 myMat3 = mat3(1.0,// 第一列
0.0,// 第二列
0.5,1.0); // 第三列

可用[ ]或.操作符来访问:

mat4 myMat4 = mat4(1.0);// Initialize diagonal to 1.0 (identity)
vec4 col0 = myMat4[0];// Get col0 vector out of the matrix
float m1_1 = myMat4[1][1];// Get element at [1][1] in matrix
float m2_2 = myMat4[2].z; // Get element at [2][2] in matrix

4)常量

const float zero = 0.0;
const float pi = 3.14159;
const vec4 red = vec4(1.0,1.0);
const mat4 identity = mat4(1.0);

5)结构体: 用基本类型和复合类型构建结构体。

struct fogStruct
{
vec4 color;
float start;
float end;
} fogVar;
fogVar = fogStruct(vec4(0.0,0.0),// color
0.5,// start
2.0); // end
vec4 color = fogVar.color;
float start = fogVar.start;
float end = fogVar.end;

6)数组:类似于C语言,索引从0开始。在创建时不能被初始化,索引只能为常量或uniform变量。

float floatArray[4];
vec4 vecArray[2];

7)操作

支持的操作有:*,/,+,-,++,--,=,+=,-=,*=,/=,==,!=,<,>,<=,>=,&&,^^,||

[cpp] view plain copy
  1. floatmyFloat;
  2. vec4myVec4;
  3. mat4myMat4;
  4. myVec4=myVec4*myFloat;//MultiplieseachcomponentofmyVec4
  5. //byascalarmyFloat
  6. myVec4=myVec4*myVec4;//together(e.g.,myVec4^2)
  7. myVec4=myMat4*myVec4;//Doesamatrix*vectormultiplyof
  8. //myMat4*myVec4
  9. myMat4=myMat4*myMat4;//Doesamatrix*matrixmultiplyof
  10. //myMat4*myMat4
  11. myMat4=myMat4*myFloat;//Multiplieseachmatrixcomponentby
  12. //thescalarmyFloat

前面矩阵的行数就是结果矩阵的行数,后面矩阵的列数就是结果矩阵的列数。

8)自定义函数:

copy

Cocos2D-X shader(三) Shader and Program编程基本概念的更多相关文章

  1. HTML利用九宫格原理进行网页布局

    这篇文章主要介绍了HTML利用九宫格原理进行网页布局,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 为什么这个OpenGL ES 2.0着色器不能在iOS上使用我的VBO?

    如果有人能够了解这里出了什么问题,也许是对gl命令或其他一些不兼容的命令序列的错误排序,我将非常感谢你的帮助.尽管谷歌在“OpenGLES2.0编程指南”中进行了大量研究和研究,但我一直试图让这段代码整天都没有成功.我正在尝试在iPhone上的OpenGLES2.0中使用顶点缓冲区对象和自定义着色器.我试图交错来自以下类型的一系列自定义结构的顶点数据:位置,半径和颜色字节分别考虑顶点位置,点大小和

  3. ios – 围绕x轴旋转AVAssetWriter的输出180度

    我正在使用AVAssetWriter创建一个Quicktime电影文件.目前输出视频是“倒置”.理论上,我可以通过围绕水平轴旋转180度来纠正这个问题.最好的方法是什么?Appledocs和wikipedia都没有明确说明仿射变换矩阵是如何工作的.并且可能有更好的方式.解决方法如果要围绕z轴旋转视频180度,或者如果你想在x轴上反射

  4. ios – 由于未捕获的异常终止应用程序“Texture Atlas Not Found”

    我创建了一个使用SpriteKit的简单动画项目.它运行良好,没有问题.当我将工作副本中的文件合并时,会出现该错误.以下是控制台中的消息:2013-10-0910:52:14.777MyProject[1550:a0b]*Terminatingappduetouncaughtexception‘TextureAtlasNotFound’,reason:‘TextureAtlasNotFound’我

  5. ios – 在Swift中找不到Double类型的初始化程序

    我想将我从文本字段获取的String值转换为Double值并存储它,但是我继续收到错误,它找不到类型为Double的intializer,该类型接受参数列表类型.如何解决这个问题?解决方法如果你有一个名为temp的String,你应该可以使用转换为Double值.

  6. ios – 将CALayer设置为SCNMaterial的漫反射内容

    过去几天,我一直在互联网上搜索无效.不幸的是,关于这个具体问题的苹果文档是模糊的,没有示例代码可用.什么似乎是你可能会问的问题?我试过玩漫漫的内容变换矩阵,但没有任何修改.我也尝试将UIView的大小调整为256×256,但是并没有修复任何东西.这是图层的代码:编辑甚至更严厉的是,如果我使用以下方式捕获视图的UIImage:并使用它作为弥漫的内容…一切工作完全正常吗?这是真的很奇怪和令人沮丧,因为图像的大小是完全一样的uiview的…

  7. ios – 如何设计一个简单的GLSL包装器,用于着色器使用

    以下简单的例子.说我有一个顶点着色器只是模拟固定的功能和两个片段着色器–一个用于绘制光滑的矩形,一个用于绘制光滑的圆.我有以下文件:基本链接现在使用这些标准的方法是什么?将上述着色器链接到两个OpenGL着色器程序?一个OO设计与着色器对象每个都有参数?

  8. ios – GL_APPLE_shader_framebuffer_fetch gl_lastFragData

    我该怎么做才能真正使用这个扩展?

  9. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  10. Swift基础篇——可选类型

    可选类型

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部