Cocos2dx Tips - Box2d, Normal mapping

22
Cocos2d-x - Tips 株式会社シュハリ 代表取締役 松浦 晃洋

description

Cocos2d-x Tips - Freehand drawing with box2d - Soft Physics, it has a soft body ( Box2d ) - Normal mapping

Transcript of Cocos2dx Tips - Box2d, Normal mapping

Page 1: Cocos2dx Tips - Box2d, Normal mapping

Cocos2d-x - Tips

株式会社シュハリ!代表取締役 松浦 晃洋

Page 2: Cocos2dx Tips - Box2d, Normal mapping

自己紹介• 松浦 晃洋!• 株式会社シュハリ 代表取締役!• Cocos2d-x 開発のレシピ執筆!

• 専門学校 Cocos2d-x 講師

• @syuhari!

• facebook.com/syuhari

Page 3: Cocos2dx Tips - Box2d, Normal mapping

• お絵描き Physics

• Soft Physics

• 法線マップ

Tips

Page 4: Cocos2dx Tips - Box2d, Normal mapping

お絵描き Physics

Page 5: Cocos2dx Tips - Box2d, Normal mapping

https://github.com/syuhari/Freehand

Page 6: Cocos2dx Tips - Box2d, Normal mapping

指で描いている最中 (CCTouchMoved)

指で描くのが終了 (CCTouchEnded)

物理オブジェクトの塊に テクスチャを貼り付ける

処理概要

Page 7: Cocos2dx Tips - Box2d, Normal mapping
Page 8: Cocos2dx Tips - Box2d, Normal mapping

Soft Physics

Page 9: Cocos2dx Tips - Box2d, Normal mapping

https://github.com/syuhari/SoftPhysics

Page 10: Cocos2dx Tips - Box2d, Normal mapping

http://www.uchidacoonga.com/2012/03/soft-body-physics-with-box2d-and-cocos2d-part-14/

• 中心となるオブジェクトを一つ作成 • その周りにオブジェクトをジョイントする • 一塊のオブジェクトにテクスチャをマッピングする

物理オブジェクトの構造

Page 11: Cocos2dx Tips - Box2d, Normal mapping

// テクスチャを作成 texture = CCTextureCache::sharedTextureCache()->addImage("texture.png"); !kmGLPushMatrix(); ccGLBindTexture2D(texture->getName()); texture->getShaderProgram()->use(); texture->getShaderProgram()->setUniformsForBuiltins(); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position|kCCVertexAttribFlag_TexCoords); !glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, 0, triangleFanPos); glVertexAttribPointer( 2, 2, GL_FLOAT, GL_FALSE, 0, textCoords); glDrawArrays(GL_TRIANGLE_FAN, 0, NUM_SEGMENTS+2); !kmGLPopMatrix();

テクスチャのマッピング

Page 12: Cocos2dx Tips - Box2d, Normal mapping
Page 13: Cocos2dx Tips - Box2d, Normal mapping

法線マップ

Page 14: Cocos2dx Tips - Box2d, Normal mapping

https://github.com/syuhari/Freehand

Page 15: Cocos2dx Tips - Box2d, Normal mapping

法線ベクトル3次元ではある面に垂直なベクトル

Page 16: Cocos2dx Tips - Box2d, Normal mapping

法線マップ

• 通常の画像は各ドットが RGB • 法線マップは RGB の部分が XYZ に相当 • 各ドットがどの方向を向いているか分かる

Page 17: Cocos2dx Tips - Box2d, Normal mapping

#ifdef GL_ES precision mediump float; #endif !varying vec2 v_texCoord; uniform sampler2D u_texture; uniform sampler2D u_normalMapTexture; uniform vec3 u_lightNormal; !void main() { ! vec4 normalMap = texture2D( u_normalMapTexture, v_texCoord ); normalMap.xyz = normalMap.xyz - 0.5; gl_FragColor = texture2D( u_texture, v_texCoord ); vec3 ret = gl_FragColor.rgb * max( 0.1, dot( normalMap.rgb, u_lightNormal ) )*3.0; gl_FragColor.rgb = ret.rgb; }

フラグメントシェーダー (GLSL)

Page 18: Cocos2dx Tips - Box2d, Normal mapping

int len = 0; const GLchar * fragmentSource = (GLchar*)CCFileUtils::sharedFileUtils() ->getFileData("MapShader.fsh", "rb", (unsigned long*)(&len)); !shader = new CCGLProgram(); setShaderProgram(shader); shader->initWithVertexShaderByteArray( ccPositionTextureA8Color_vert, fragmentSource); !shader->addAttribute( kCCAttributeNamePosition, kCCVertexAttrib_Position); shader->addAttribute( kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); !shader->link(); shader->updateUniforms();

フラグメントシェーダーをリンクする

Page 19: Cocos2dx Tips - Box2d, Normal mapping

// ファイル名に「_n」を付けたリソースを法線マップとして読込む std::string map = baseName + "_n.png"; colorRampTexture = CCTextureCache::sharedTextureCache()->addImage(map.c_str()); colorRampTexture->setAliasTexParameters(); this->shader->use(); glActiveTexture(GL_TEXTURE1+tex); glBindTexture(GL_TEXTURE_2D, colorRampTexture->getName()); glActiveTexture(GL_TEXTURE0);

法線マップを読み込む

Page 20: Cocos2dx Tips - Box2d, Normal mapping

float xx, yy, zz, length; !//シェーダー使用を宣言 this->shader->use(); // 光源までの距離 CCSize size = CCDirector::sharedDirector()->getWinSize(); xx = (this->getLight().x - this->getPositionX()) / size.width; yy = (this->getLight().y - this->getPositionY()) / size.height; !length = sqrtf( xx * xx + yy * yy ); zz = 1-length; length = sqrtf( zz * zz + xx * xx + yy * yy ); zz = zz / length; xx = xx / length; yy = yy / length; //シェーダープログラムに光源の位置をセット glUniform3f(lightNormalUniformLocation, xx, yy, zz);

法線マップを読み込む

Page 21: Cocos2dx Tips - Box2d, Normal mapping
Page 22: Cocos2dx Tips - Box2d, Normal mapping

エンジニア募集中!

• @syuhari!

• facebook.com/syuhari