2017-09-04 17:02:43 afei198409 阅读数 1866
可以参考http://blog.csdn.net/afei198409/article/details/50594665了解必须的shader使用知识。
首先.vsh文件(这里有两个,一个test_noMVP.vsh用于本地,一个test.vsh用于浏览器)
test_noMVP.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;
}


test.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 * CC_MVMatrix * a_position;
    v_fragmentColor = a_color;
    v_texCoord = a_texCoord;
}


然后是.fsh文件
test.fsh文件描述如下:
#ifdef GL_ES
precision mediump float;
#endif


varying vec4 v_fragmentColor;
varying vec2 v_texCoord;


uniform vec2 blurSize;


void main() {
    vec4 sum = vec4(0.0);
    sum += texture2D(CC_Texture0, v_texCoord - 0.0004 * blurSize) * 0.05;
    sum += texture2D(CC_Texture0, v_texCoord - 0.0003 * blurSize) * 0.09;
    sum += texture2D(CC_Texture0, v_texCoord - 0.0002 * blurSize) * 0.12;
    sum += texture2D(CC_Texture0, v_texCoord - 0.0001 * blurSize) * 0.15;
    sum += texture2D(CC_Texture0, v_texCoord) * 0.16;
    sum += texture2D(CC_Texture0, v_texCoord + 0.0001 * blurSize) * 0.15;
    sum += texture2D(CC_Texture0, v_texCoord + 0.0002 * blurSize) * 0.12;
    sum += texture2D(CC_Texture0, v_texCoord + 0.0003 * blurSize) * 0.09;
    sum += texture2D(CC_Texture0, v_texCoord + 0.0004 * blurSize) * 0.05;


    gl_FragColor = sum * v_fragmentColor;
}


使用如下:
首先创建一个cocos2dx-js的hello world项目,打开app.js进行修改
var HelloWorldLayer = cc.Layer.extend({
    ctor:function () {
        this._super();
        var size = cc.winSize;
        var png = new cc.Sprite("res/HelloWorld.png");
        png.setPosition(size.width * 0.5, size.height * 0.5);
        this.addChild(png, 10);
        this.blurSprite(png);
        return true;
    },
    blurSprite:function(sprite)
    {
        var blurSize = cc.size(40, 40);
        if( 'opengl' in cc.sys.capabilities ) {
            cc.log("support opengl shader");
            //the renderers of webgl and opengl is quite different now, so we have to use different shader and different js code
            if (cc.sys.isNative) {
                var shader = new cc.GLProgram("res/test_noMVP.vsh", "res/test.fsh");
                shader.link();
                shader.updateUniforms();
                var glProgram_state = cc.GLProgramState.getOrCreateWithGLProgram(shader);
//设置参数值(blurSize对应test.fsh里面的blurSize)
                glProgram_state.setUniformVec2("blurSize", blurSize);
//添加shader
                sprite.setGLProgramState(glProgram_state);
            } else {
                var shader = new cc.GLProgram("res/test.vsh", "res/test.fsh");
                shader.retain();
                shader.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
                shader.addAttribute(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR);
                shader.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
                shader.link();
                shader.updateUniforms();
                shader.use();
//设置参数值
                shader.setUniformLocationWith2f(shader.getUniformLocationForName('blurSize'), blurSize.width, blurSize.height);
//添加shader
                sprite.shaderProgram = shader;
            }
        } else {
            cc.log("no support opengl shader");
        }
    }
});

......


运行效果图如下:



2016-03-24 00:33:49 taotanty 阅读数 3442

它是一种类似于C语言的专门为GPU设计的语言,它可以放在GPU里面被并行运行。
对于第一次使用 shader程序的人来说,看到网上一大堆的介绍.vsh,.fsh文件代码,但是就是不知道从哪里下手,(我就是这样滴),这里我就讲述下我的学习使用过程。

  1. 认识.vsh,.fsh 这两个文件在被编译和链接后就可以产生可执行程序与GPU交互。 .vsh 是 vertex shader,用与顶点计算,可以理解为控制顶点的位置,在这个文件中我们通常会传入当前顶点的位置,和纹理的坐标。 .fsh
    是片段shader,或者叫片元shader。在这里面我可以对于每一个像素点进行重新计算。

  2. .vsh和.fsh在opengl 渲染的流程是怎样的?
    那我们就要先看一下:
    着色器对象关联着色器代码,glShaderSource
    把着色器源代码编译成目标代码,glCompileShader
    验证着色器是否已经变异通过, glGetShaderivgl GetShaderInfoLog
    创建一个着色器程序,glCreatePragram
    把着色器链接到着色器程序中, glAttachShader
    链接着色器程序, glLinkProgram
    验证着色器程序是否链接成功, glGetProgramiv glGetProgramInfoLog

    3.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);

    简单解释下,每个Node 对象都会 有一个GLProgram
    对象,设定一系列的OPGL参数之后,在Node渲染函数里面进行渲染,无外乎就是颜色,位置,透明度,uv等一系列的变换。
    比如dota传奇里面的冰霜效果,具体的渲染原理就是,顶点不变,将纹理(对应着图片)的颜色值改变,说白了就是修改r,g,b值。(当然,你也可以直接使用Sprite的接口进行更改了,但是
    这里使用的OpenGL进行修改的,使用的仅仅是
    GPU,如果你使用接口去改,需要写很多逻辑代码,就会占用大量的CPU了!)。冰霜效果实在片元shader里面进行修改的,通过宿主程序,如Cocos2dx封装好的接口,传入参数,然后shader里面判断非透明的地方就修改冰冻效果的rgb值,这样出来的效果就是冰霜效果了

    既然使用了 这门语言当然就需要了解下其中的语法和内建变亮了,下片文章我们继续介绍。谢谢

推荐文章:
http://www.cnblogs.com/slysky/p/3949718.html
http://zhidao.baidu.com/link?url=Aas_sRAAGRzOJvEb65BMo9JupMfp74iPBf-PWv1DIAmqaceG2IFC7KjN3ds8LOO9XHEWNWLMBACxJBVM_SGRSEm3c0tk_mzh7H35Ir8Cqpy

2019-01-09 18:48:07 blogsun 阅读数 165

着色器

认识.vsh,.fsh 这两个文件在被编译和链接后就可以产生可执行程序与GPU交互。

.vsh 是 vertex shader,用与顶点计算,可以理解为控制顶点的位置,在这个文件中我们通常会传入当前顶点的位置,和纹理的坐标。

.fsh
是片段shader,或者叫片元shader。在这里面我可以对于每一个像素点进行重新计算。

.vsh和.fsh在opengl 渲染的流程

着色器对象关联着色器代码,glShaderSource
把着色器源代码编译成目标代码,glCompileShader
验证着色器是否已经变异通过, glGetShaderivgl GetShaderInfoLog
创建一个着色器程序,glCreatePragram
把着色器链接到着色器程序中, glAttachShader
链接着色器程序, glLinkProgram
验证着色器程序是否链接成功, glGetProgramiv glGetProgramInfoLog

cocos2dx中使用shader

auto sprite = Sprite::create(“afei.png”);
sprite->setPosition(vec2(300, 400)); fNode->addChild(sprite); auto

//创建program

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);
简单解释下,每个Node 对象都会 有一个GLProgram
对象,设定一系列的OPGL参数之后,在Node渲染函数里面进行渲染,无外乎就是颜色,位置,透明度,uv等一系列的变换。
比如dota传奇里面的冰霜效果,具体的渲染原理就是,顶点不变,将纹理(对应着图片)的颜色值改变,说白了就是修改r,g,b值。

2004-07-02 08:32:00 lsl707 阅读数 1500

实际上,.fx文件的用处在directx8时候就已经体现出来了。

在.fx文件中,因为可以记录顶点渲染,像素渲染等,那么与.vsh 和.psh文件有什么区别呢

1。两种类型的渲染可以在同一个文件中实现

2。支持渲染状态和纹路状态表述

3。多重路径表述ok

4。D3D可以访问文件中字符串和函数

总而言之,direct9.0的.fx file= DirectX 8的.fx file+ *.vsh + *.psh

2012-08-17 12:21:51 zhuozy 阅读数 334


原因是  默认导入shader文件时, xcode 把 *.fsh,*.vsh 文件当成了 编译文件 (因为里面写的确实是 C 代码微笑),加入到了 compile source 里了;

其实这是不对的,我们的目的是想将其当作resource文件使用,(及时编译也是 GLES 内部编译,不需要xcode代劳)

所以解决方案应该是将compile source里的shader文件去掉,重新加入到 copy bundle resource 里; 

否则打包时 shader 文件默认被忽略,导致程序找不到shader文件,无法启动

cocos2dx Shader的使用

阅读数 631

使用着色器

阅读数 1669

没有更多推荐了,返回首页