cocos2dx shader绘制摆动的小草
首页 > cocos2dx专栏 > cocos2dx学习    作者:闭眼就天黑   2016年9月18日 18:37 星期日   热度:8539°   百度已收录  
时间:2016-9-18 18:37   热度:8539° 

今天心血来潮想看下cocos2dx的shader,一直看见别人在群里讨论感觉很高深。下载了一个例子看了下,例子是cocos2dx 2.x的,这里我移植成3.x的了。

网盘地址:链接: https://pan.baidu.com/s/1gft3bxx 密码: 5br3

ActiveGrass.h


//--------------------------------------------------------
#pragma once
//--------------------------------------------------------
#include "cocos2d.h"
USING_NS_CC;
//--------------------------------------------------------
class CActiveGrassLayer : public Layer 
{
public:
	static CActiveGrassLayer* createCActiveGrassLayer();
	virtual bool init();
	virtual void update(float delta);
private:
	int		m_nTimeUniformLocation;
	float	m_fTime;
public:
	CREATE_FUNC( CActiveGrassLayer );
};
//--------------------------------------------------------


ActiveGrass.cpp

//--------------------------------------------------------
#include "ActiveGrass.h"
//--------------------------------------------------------
static const GLchar* szGrassShader = 
	"																									\n\
	#ifdef GL_ES																						\n\
		precision mediump float;																		\n\
	#endif																								\n\
																										\n\
	varying vec2 v_texCoord;																			\n\
	uniform sampler2D u_texture;																		\n\
	uniform float u_time;																				\n\
																										\n\
	// 1																								\n\
	const float speed = 2.0;																			\n\
	const float bendFactor = 0.2;																		\n\
	void main()																							\n\
	{																									\n\
	// 获得高度,texCoord从下到上为0到1																	\n\
	float height = 1.0 - v_texCoord.y;																	\n\
	// 获得偏移量,一个幂函数,值愈大,导数越大,偏移量愈大													\n\
	float offset = pow(height, 2.5);																	\n\
	// 偏移量随时间变化,并乘以幅度,设置频率																\n\
	offset *= (sin(u_time * speed) * bendFactor);														\n\
	// 使x坐标偏移,fract取区间值(0,1)																	\n\
	vec3 normalColor = texture2D(u_texture, fract(vec2(v_texCoord.x + offset, v_texCoord.y))).rgb;		\n\
	gl_FragColor = vec4(normalColor, 1);																\n\
	}";

CActiveGrassLayer* CActiveGrassLayer::createCActiveGrassLayer()
{
	CActiveGrassLayer* layer = new (std::nothrow) CActiveGrassLayer();
	if (layer && layer->init())
	{
		layer->autorelease();
		return layer;
	}
	CC_SAFE_DELETE(layer);
	return nullptr;
}

//--------------------------------------------------------
bool CActiveGrassLayer::init()
{
	do{
		CC_BREAK_IF(!CCLayer::init());

		m_fTime = 0.0f;

		Sprite* pSprite = Sprite::create( "ActiveGrass/Grass.png" );
		if( pSprite == NULL )
		{
			break;
		}
		Size winSize = Director::getInstance()->getWinSize();
		pSprite->setPosition( Vec2(winSize.width / 2, winSize.height / 2) );
		pSprite->setTag( 10001 );
		this->addChild( pSprite );

		// 加载顶点着色器和片元着色器
		GLProgram* pShader = new  GLProgram();
		pShader->initWithByteArrays(ccPositionTextureA8Color_vert, szGrassShader);//顶点着色器,后一个参数则指定了像素着色器:
		pSprite->setGLProgram(pShader);
		pShader->release();
		CHECK_GL_ERROR_DEBUG();

		// 启用顶点着色器的attribute变量,坐标、纹理坐标、颜色
		pSprite->getGLProgram()->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);//对应vs里面的顶点坐标
		pSprite->getGLProgram()->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);//对应vs里面的顶点颜色
		pSprite->getGLProgram()->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD2, GLProgram::VERTEX_ATTRIB_TEX_COORD);//对应vs里面的顶点纹理坐标 
		CHECK_GL_ERROR_DEBUG();

		// 自定义着色器链接
		pSprite->getGLProgram()->link();//因为绑定了属性,所以需要link一下,否则vs无法识别属性
		CHECK_GL_ERROR_DEBUG();

		// 设置移动、缩放、旋转矩阵
		pSprite->getGLProgram()->updateUniforms();//绑定了纹理贴图
		CHECK_GL_ERROR_DEBUG();

		m_nTimeUniformLocation = glGetUniformLocation(pSprite->getGLProgram()->getProgram(), "u_time");

		pSprite->getGLProgram()->use();//调用glUseProgram()方法

		// 开启帧更新
		this->scheduleUpdate();
		return true;
	}while(0);
	return false;
}
//--------------------------------------------------------
void CActiveGrassLayer::update(float delta)
{
	m_fTime += delta;
	Sprite* p = (Sprite*)getChildByTag( 10001 );
	if( p )
	{
		p->getGLProgram()->use();
	}
	glUniform1f( m_nTimeUniformLocation, m_fTime);
}


运行结果效果:

jdfw.gif

二维码加载中...
本文作者:闭眼就天黑      文章标题: cocos2dx shader绘制摆动的小草
本文地址:https://www.byjth.com/biji/92.html
版权声明:若无注明,本文皆为“闭眼就天黑专栏_技术博客_个人学习总结”原创,转载请保留文章出处。
相关文章

版权所有:《闭眼就天黑专栏_技术博客_个人学习总结》 => 《cocos2dx shader绘制摆动的小草
本文地址:https://www.byjth.com/biji/92.html
除非注明,文章均为 《闭眼就天黑专栏_技术博客_个人学习总结》 原创,欢迎转载!转载请注明本文地址,谢谢。

返回顶部    首页    手机版本    版权所有:闭眼就天黑专栏_技术博客_个人学习总结
    站长: 闭眼就天黑    搜索cocos2dx主题 技术支持:闭眼就天黑   皖ICP备14007736号-1  

皖公网安备 34132102000107号

   sitemap