Cocos流体之 LiquidFun流体纹理shader的编写(二)

 

Cocos流体之 集成LiquidFun&&并自定义到CocosFrameWork(一)


贴图效果:

b2_waterParticle:


b2_elasticParticle:



创建b2ParticleSystem

b2ParticleSystemDef particleSystemDef;
    particleSystemDef.dampingStrength = 0.2f;//阻尼
    particleSystemDef.radius = 0.1f;//每个粒子的半径,半径越小模拟程度越高,但同时对硬件性能要求更高
    _particleSystem = _world->CreateParticleSystem(&particleSystemDef);//创建b2ParticleSystem
    _particleSystem->SetGravityScale(0.4f);//重力比例
    _particleSystem->SetDensity(0.8f);//粒子的密度

    b2ParticleGroupDef pd;//粒子组
    pd.position.Set(s.width / 2 / PTM_RATIO, s.height / 2 / PTM_RATIO);
    pd.flags = b2ParticleFlag::b2_waterParticle;
    //pd.groupFlags = b2ParticleGroupFlag::b2_rigidParticleGroup;
    //粒子组的形状,如下粒子组形状为5*6的box(盒子),通俗讲,即创建出一盒子的粒子
    b2PolygonShape shape2;
    shape2.SetAsBox(5.0f, 6.0f, b2Vec2(0.0f, 0.0f), 0.0);
    pd.shape = &shape2;
    _particleSystem->CreateParticleGroup(pd);
//LiquidSprite是自定义类,用于绘制贴图
	auto ls = LiquidSprite::create(_particleSystem, PTM_RATIO);
	this->addChild(ls);




下面是LiquidSprite类的实现:

LiquidSprite::create(_particleSystem, PTM_RATIO);
要传入两个参数,_particleSystem是粒子系统,可用其获取所有粒子的位置、颜色等信息,然后传入Shader作为坐标顶点(a_position)、纹理坐标(a_texCoord)进行着色。

PTM_RATIO是物理坐标与像素坐标的比例关系。


Shader:

vs部分:liquid.vert

attribute vec4 a_position;//需传入所有粒子的坐标
attribute vec2 a_texCoord;//纹理贴图的纹理坐标
uniform vec4 u_color;//颜色混合
uniform float u_pointSize;//传入粒子的大小
uniform float u_ratio;//传入的屏幕坐标系与物理坐标系的比例
uniform vec2 u_texSize;
#ifdef GL_ES
varying lowp vec4 v_fragmentColor;
varying lowp vec2 v_texCoord;
#else
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
#endif

void main()
{
    vec4 pos = vec4(a_position.xy*u_ratio, 1, 1); //将物理世界坐标系转化为像素坐标系
    gl_Position = CC_MVPMatrix * pos;
    gl_PointSize = u_pointSize;
    v_fragmentColor = u_color;
	//vec2 newCoord = vec2(clamp(a_texCoord.x, 0.0, 1.0), clamp(a_texCoord.y, 0.0, 1.0));
    v_texCoord = a_texCoord;
}


PS部分:liquid.frag

#ifdef GL_ES
varying lowp vec4 v_fragmentColor;
varying lowp vec2 v_texCoord;
#else
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
#endif
uniform sampler2D u_texture;//传入Texture2D 纹理贴图
void main()
{
    gl_FragColor = texture2D(u_texture, v_texCoord)*v_fragmentColor;//将纹理采样颜色与v_fragmentColor混合,然后输出
}

创建并应用shader:

auto uTexture = Director::getInstance()->getTextureCache()->addImage("HelloWorld.png");
auto texSize = uTexture->getContentSize();
auto program = GLProgram::createWithFilenames("shader/liquid.vert", "shader/liquid.frag");
auto pState = GLProgramState::getOrCreateWithGLProgram(program);
pState->setUniformTexture("u_texture", uTexture);//纹理贴图传入shader
//pState->setUniformVec2("u_texSize", texSize);//纹理的大小
pState->setUniformVec4("u_color", Vec4(1, 1, 1, 0.7));  //要进行混合的颜色
pState->setUniformVec4("u_ratio", _ratio);
pState->setUniformFloat("u_pointSize", _pSystem->GetRadius()*_ratio*2);//绘制点的大小,粒子半径*比例*2即粒子直径
this->setGLProgramState(pState);//应用Shader

将顶点位置传入Shader:

auto vertsCount = _pSystem->GetParticleCount();//b2ParticleSystem函数,获取粒子数量

posVerts = _pSystem->GetPositionBuffer();//b2ParticleSystem函数,获取粒子位置数组
//顶点转换
for (int i = 0; i < vertsCount; i++)
{
	b2Vec2 vec = posVerts[i];
	texCoords.push_back(Vec2(vec.x * _ratio / texSize.width,
			1 - vec.y * _ratio / texSize.height));
}
	
pState->setVertexAttribPointer("a_position", 2, GL_FLOAT, GL_FALSE, sizeof(Vec2), &posVerts[0]);//传入shader
pState->setVertexAttribPointer("a_texCoord", 2, GL_FLOAT, GL_FALSE, sizeof(Vec2), &texCoords[0]);//传入shader

使用GL_POINTS模式进行绘制:
glDrawArrays(GL_POINTS, 0, posVerts.size());

源码下载: 链接:http://yun.baidu.com/s/1pJEdz8B


Cocos2d流体是一个用于创建流体效果的引擎。它是Cocos2d家族中的一部分,为游戏开发者提供了一个简单而强大的工具来实现流体效果。 Cocos2d流体通过模拟流体的物理特性来实现效果。它使用了流体动力学模型,包括流体的粘度、密度、压力等参数,通过计算流体的运动方程来模拟其行为。这使得游戏中的水、烟雾、火焰等流体效果更加逼真,增强了游戏的视觉效果和沉浸感。 Cocos2d流体引擎提供了丰富的特性和功能,使开发者能够轻松地创建各种流体效果。它支持维和三维流体模拟,可以在游戏中实现各种不同的流体效果,如水波、流动的烟雾、火焰喷射等。开发者可以通过调整流体的参数和属性来实现不同的效果,如改变粘度来调整流体的流动速度,改变密度来调整流体的颜色等。 除了流体模拟,Cocos2d流体还提供了其他一些有用的功能。它支持碰撞检测,使流体能够与其他游戏元素进行交互,如与物体碰撞产生溅射效果。它还支持粒子系统,可以创建流体效果的粒子,如烟雾粒子、水滴粒子等。 总之,Cocos2d流体是一个强大而易于使用的引擎,可用于创建各种流体效果。它通过模拟流体的物理特性和行为,使游戏中的流体效果更加真实和逼真,提升了游戏的视觉效果和沉浸感。无论是制作水下冒险游戏还是烟雾弥漫的战斗场景,Cocos2d流体都能提供所需的工具和特性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值