资料来自网络收集

着色器
着色器(shader)应用于计算机图形学领域,指一组供计算机图形资源在执行渲染任务时使用的指令.程序员将着色器应用于图形处理(GPU)的可编程流水线,来实现三维应用程序.这样的图形处理器有别于传统的固定流水线处理器,为GPU编程带来更高的灵活性和适应性.
opengl es的着色器有.vsh和.fsh两个文件.这两文件在被编译和链接后就可以产生可执行程序与GPU交互.
有人总结:
.vsh 负责搞定像素位置,填写gl_Position变量,偶尔搞定一下点大小的问题,填写gl_PixelSize.
.fsh 负责搞定像素外观,填写gl_FragColor,偶尔配套填写另外一组变量.
这两文件都是一个像素运行一次的,也可能运行多次.为了"这一像素"而努力计算.下面是简单的示范:
.vsh文件
attribute vec4 a_position; //attribute : 外部传入vsh文件的变量,每帧渲染的可变参数
attribute vec4 a_color;
attribute vec2 a_texCoord;
#ifdef GL_ES
varying lowp vec4 v_fragmentColor; //varying : 用于vsh和fsh之间相互传递的参数
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;
}
.fsh文件
#ifdef GL_ES
precision mediump float;
#endif
varying vec4 v_fragmentColor; //varying : 注意它与vsh文件中的定义是一致的
varying vec2 v_texCoord;
//uniform float blurRadius; //uniform : 外部传入vsh文件的变量,变化率较低,可能只是个常量
void main(void)
{
vec4 col = texture2D(CC_Texture0,v_texCoord);
gl_FragColor = vec4(col) * v_fragmentColor;
}
如果对上面两个文件定义不了解,建议先去了解下GLSL.下面只作简单的介绍.
基本类型:
void – 用于没有返回值的函式
bool – 条件类型,其值可以是真或假
int – 带负号整数
float – 浮点数
vec2 – 2 个浮点数组成的向量
vec3 – 3 个浮点数组成的向量
vec4 – 4 个浮点数组成的向量
bvec2 – 2 个布林组成的向量
bvec3 – 3 个布林组成的向量
bvec4 – 4 个布林组成的向量
ivec2 – 2 个整数组成的向量
ivec3 – 3 个整数组成的向量
ivec4 – 4 个整数组成的向量
mat2 – 浮点数的 2X2 矩阵
mat2x3 – 浮点数的 2X3 矩阵
mat2x4 – 浮点数的 2X4 矩阵
mat3 – 浮点数的 3X3 矩阵
mat3x2 – 浮点数的 3X2 矩阵
mat3x4 – 浮点数的 3X4 矩阵
mat4 – 浮点数的 4X4 矩阵
mat4x2 – 浮点数的 4X2 矩阵
mat4x3 – 浮点数的 4X3 矩阵
sampler1D – 用来存取一维纹理的句柄(handle)(或:操作,作名词解。)
sampler2D – 用来存取二维纹理的句柄
sampler3D – 用来存取三维纹理的句柄
samplerCube – 用来存取立方映射纹理的句柄
sampler1Dshadow – 用来存取一维深度纹理的句柄
sampler2Dshadow – 用来存取二维深度纹理的句柄
修饰符:
const - 常量值必须在声明时初始化
attribute - 表示只读的顶点数据,只用在顶点着色器中.数据来自当前的顶点状态或者顶点数组.它必须是全局范围声明的,不能在函数内部.
uniform - 一致变量.在着色器执行期间一致变量的值是不变的.与const常量不同的是,这个值在编译时期是未知的是由着色器外部初始化的.一致变量在顶点着色器和片段着色器之间是共享的.它也只能在全局范围进行声明.
varying - 顶点着色器的输出.例如颜色或者纹理坐标,作为片段着色器的只读输入数据.必须是全局范围声明的全局变量.可以是浮点数类型的标量,向量,矩阵.不能是数组或者结构体.
centorid varying - 在没有多重采样的情况下,与varying是一样的意思.在多重采样时,centorid varying在光栅化的图形内部进行求值而不是在片段中心的固定位置求值.
in - 用在函数的参数中,表示这个参数是输入的,在函数中改变这个值,并不会影响对调用的函数产生副作用.这个是函数参数默认的修饰符.
out - 用在函数的参数中,表示这个参数是输出参数,值是会改变的.
inout - 用在函数的参数,表示这个参数既是输入参数也是输出参数.
内置变量:
顶点着色器内置变量:
gl_Color - 输入属性,表示顶点的主颜色
gl_SecondaryColor - 输入属性,表示顶点的辅助颜色
gl_normal - 输入属性,表示顶点的法线值
gl_Vertex - 输入属性,表示物体空间的顶点位置
gl_MultiTexCoordn - 输入属性,表示顶点的第n个纹理的坐标
gl_FogCoord - 输入属性,表示顶点的雾坐标
gl_Position - 输入属性,变换后的顶点的位置,用于后面的固定的裁剪等操作.所有的顶点着色器都必须写这个值.
gl_ClipVertex - 输出坐标,用于用户裁剪平面的裁剪
gl_PositionSize - 点的大小
glFrontColor - 正面的主颜色的varying输出
gl_BackColor - 背面主颜色的varying输出
gl_FrontSecondaryColor - 下面辅助颜色的varying输出
gl_BackSecondaryColor - 背面辅助颜色的varying输出
gl_TexCoord[] - 纹理坐标的数组varying输出
gl_FogFragCoord - 雾坐标的varying输出
片段着色器内置变量:
gl_Color - 包含主颜色的插值只读输入
gl_SecondaryColor - 包含辅助颜色的插值只读输入
gl_TexCoord[] - 包含纹理坐标数组的插值只读输入
gl_FogFragCoord - 包含雾坐标的插值只读输入
gl_FragCoord - 只读输入,窗口的x,y和1/w
gl_FrontFacing - 只读输入,如果是窗口正面图元的一部分,则这个值为true
gl_PointCoord - 点精灵的二维空间坐标范围在(0,0)到(1,1)之间,公用于点图元和点精灵开启的情况下.
gl_FragData[] - 使用glDrawBuffers输出的数据数组,不能与gl_FragColor结合使用.
gl_FragColor - 输出的颜色用于随后的像素操作
gl_FragDepth - 输出的尝试用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替


shader的使用流程
1 创建着色器对象
glCreateShader
2 着色器对象关联着色器代码
glShaderSource
3 把着色器源代码编译成目标代码
glCompileShader
4 验证着色器是否已经变异通过
glGetShaderiv glGetShaderInfoLog
5 创建一个着色器程序
glCreatePragram
6 把着色器链接到着色器程序中
glAttachShader
7 链接着色器程序
glLinkProgram
8 验证着色器程序是否链接成功
glGetProgramiv glGetProgramInfoLog
9 使用着色器程序进行定点或片段处理
gluseProgram


cocos2dx使用shader
下面是简单的示例: auto sprite = Sprite::create("afei.png"); sprite->setPosition(vec2(300,400)); fNode->addChild(sprite); auto program = GLProgram::createWithFilenames("afei.vsh","afei.fsh"); program->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION,GLProgram::VERTEX_ATTRIB_POSITION); program->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR,GLProgram::VERTEX_ATTRIB_COLOR); program->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD,GLProgram::VERTEX_ATTRIB_TEX_COORD); program->link(); program->updateUniforms(); sprite->setGLProgram(program);

cocos2dx Shader的使用的更多相关文章

  1. ios – 如何从变量访问属性或方法?

    是否可以使用变量作为Swift中方法或属性的名称来访问方法或属性?在PHP中,您可以使用$object->{$variable}.例如编辑:这是我正在使用的实际代码:解决方法你可以做到,但不能使用“纯粹的”Swift.Swift的重点是防止这种危险的动态属性访问.你必须使用Cocoa的Key-ValueCoding功能:非常方便,它完全穿过你要穿过的字符串到属性名称的桥,但要注意:这里是龙.

  2. iOS >>块>>更改块外部的变量值

    我不是在处理一个Object并改变它,就像我的mString一样.我希望’center’属性的行为类似于myInt,因为它是直接访问的C结构,而不是指向对象的指针.我希望’backgroundColor’的行为类似于我的imstring,因为它是一个指向一个新对象的对象的指针,不是吗?

  3. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  4. ios – 使用附加字符串本地化Info.plist变量

    我正在尝试本地化应用程序的名称,同时仍然能够根据构建配置追加字符串.所以目前它被设置为:该设置定义为:通过这种方式,我们可以为应用程序添加后缀以用于不同的beta版本.问题是,当我们尝试本地化本地化的InfoPlist.strings中的应用程序显示名称时,就像这样我们覆盖存储在Info.plist中的值,并丢失后缀字符.这有什么好办法吗?

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

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

  6. iOS – 开始iOS教程 – 变量之前的下划线?

    这是正确的还是我做错了什么?

  7. ios – 静态计算变量被多次实例化

    我有一个日期格式化程序,我试图在UITableViewCell子类中创建一个单例,所以我创建了一个这样的计算属性:问题是我不止一次看到print语句,这意味着它不止一次被创建.我已经找到了其他方法,但我很想知道这里发生了什么.有任何想法吗?解决方法您的代码段相当于只获取属性,基本上它与以下内容相同:如果你只想运行一次,你应该像定义一个惰性属性一样定义它:

  8. ios – UIApplication.delegate必须仅在主线程中使用[复制]

    我应该在主调度中的viewControllers中声明这些)变量位置声明定义了它的范围.您需要确定这些变量的范围.您可以将它们声明为项目或应用程序级别(全局),类级别或特定此功能级别.如果要在其他ViewControllers中使用这些变量,则使用公共/开放/内部访问控制将其声明为全局或类级别.

  9. ios – 无法理解Objective-C块文档

    为什么localVariable“按价值使用?”>如果我在第二个例子中将__block存储类型添加到localVariable,我错误地假设该块关闭了变量,所以它将它保留在堆中直到块被释放?解决方法Howexactlyisoneexample“accessedbyreference”whiletheotheroneisaccessedbyvariable?self是当前正在执行找到块的方法的对象.强引用只是意味着对象的保留计数增加.IfIaddthe__blockstoragetypetolocalVar

  10. ios – 为BOOL变量编写getter和setter

    显然,使用obj-c,通常没有理由编写getter和setter(感谢有用的mr@synthesize).所以现在,需要做到这一点,我遇到了一个我不知道如何编写它们的问题.:p我敢肯定我可能不会以正确的方式解决我的问题–只是将我的对象子类化得更容易–但我正在尝试编写类别代码以添加属性,因为(在开头)它更快,因为我想学习如何在我的应用程序中使用类别代码.我有这个:我在setter中没有if查询就试过

随机推荐

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

返回
顶部