cocos 2 dxソース分析:内蔵シェーダ
33663 ワード
cococos 2 dxエンジン自体は、ファイルCCGLProgram.hにコードが記載されている、直接使用できるパーティション内のシェーダを提供しています.
これらのシェーダのshaderファイルはエンジンのrendererディレクトリの下にあり、fragはピクセルシェーダ、vertは頂点シェーダです.
cococos 2 dxプログラムが起動すると、GLProgramCache::loadDefaultGLProgramsでこれらの内蔵シェーダをシステムにロードします.
使用方法:
/** @name Built Shader types @{ */
/**Built in shader for 2d. Support Position, Texture and Color vertex attribute.*/
static const char* SHADER_NAME_POSITION_TEXTURE_COLOR;
/**Built in shader for 2d. Support Position, Texture and Color vertex attribute, but without multiply vertex by MVP matrix.*/
static const char* SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP;
/**Built in shader for 2d. Support Position, Texture vertex attribute, but include alpha test.*/
static const char* SHADER_NAME_POSITION_TEXTURE_ALPHA_TEST;
/**Built in shader for 2d. Support Position, Texture and Color vertex attribute, include alpha test and without multiply vertex by MVP matrix.*/
static const char* SHADER_NAME_POSITION_TEXTURE_ALPHA_TEST_NO_MV;
/**Built in shader for 2d. Support Position, Color vertex attribute.*/
static const char* SHADER_NAME_POSITION_COLOR;
/**Built in shader for 2d. Support Position, Color, Texture vertex attribute. texture coordinate will used as point size.*/
static const char* SHADER_NAME_POSITION_COLOR_TEXASPOINTSIZE;
/**Built in shader for 2d. Support Position, Color vertex attribute, without multiply vertex by MVP matrix.*/
static const char* SHADER_NAME_POSITION_COLOR_NO_MVP;
/**Built in shader for 2d. Support Position, Texture vertex attribute.*/
static const char* SHADER_NAME_POSITION_TEXTURE;
/**Built in shader for 2d. Support Position, Texture vertex attribute. with a specified uniform as color*/
static const char* SHADER_NAME_POSITION_TEXTURE_U_COLOR;
/**Built in shader for 2d. Support Position, Texture and Color vertex attribute. but alpha will be the multiplication of color attribute and texture.*/
static const char* SHADER_NAME_POSITION_TEXTURE_A8_COLOR;
/**Built in shader for 2d. Support Position, with color specified by a uniform.*/
static const char* SHADER_NAME_POSITION_U_COLOR;
/**Built in shader for draw a sector with 90 degrees with center at bottom left point.*/
static const char* SHADER_NAME_POSITION_LENGTH_TEXTURE_COLOR;
/**Built in shader for ui effects */
static const char* SHADER_NAME_POSITION_GRAYSCALE;
/** @{ Built in shader for label and label with effects. */
static const char* SHADER_NAME_LABEL_NORMAL;
static const char* SHADER_NAME_LABEL_OUTLINE;
static const char* SHADER_NAME_LABEL_DISTANCEFIELD_NORMAL;
static const char* SHADER_NAME_LABEL_DISTANCEFIELD_GLOW;
/**Built in shader used for 3D, support Position vertex attribute, with color specified by a uniform.*/
static const char* SHADER_3D_POSITION;
/**Built in shader used for 3D, support Position and Texture vertex attribute, with color specified by a uniform.*/
static const char* SHADER_3D_POSITION_TEXTURE;
/** Built in shader used for 3D, support Position (Skeletal animation by hardware skin) and Texture vertex attribute, with color specified by a uniform. */
static const char* SHADER_3D_SKINPOSITION_TEXTURE;
/** Built in shader used for 3D, support Position and Normal vertex attribute, used in lighting. with color specified by a uniform. */
static const char* SHADER_3D_POSITION_NORMAL;
/** Built in shader used for 3D, support Position, Normal, Texture vertex attribute, used in lighting. with color specified by a uniform. */
static const char* SHADER_3D_POSITION_NORMAL_TEXTURE;
/** Built in shader used for 3D, support Position(skeletal animation by hardware skin), Normal, Texture vertex attribute, used in lighting. with color specified by a uniform. */
static const char* SHADER_3D_SKINPOSITION_NORMAL_TEXTURE;
/** Built in shader used for 3D, support Position, Bumped Normal, Texture vertex attribute, used in lighting. with color specified by a uniform. */
static const char* SHADER_3D_POSITION_BUMPEDNORMAL_TEXTURE;
/** Built in shader used for 3D, support Position(skeletal animation by hardware skin), Bumped Normal, Texture vertex attribute, used in lighting. with color specified by a uniform. */
static const char* SHADER_3D_SKINPOSITION_BUMPEDNORMAL_TEXTURE;
/** Built in shader for particles, support Position and Texture, with a color specified by a uniform. */
static const char* SHADER_3D_PARTICLE_TEXTURE;
/** Built in shader for particles, support Position, with a color specified by a uniform. */
static const char* SHADER_3D_PARTICLE_COLOR;
/** Built in shader for skybox */
static const char* SHADER_3D_SKYBOX;
/** Built in shader for terrain */
static const char* SHADER_3D_TERRAIN;
/** Built in shader for camera clear */
static const char* SHADER_CAMERA_CLEAR;
/** end of built shader types. @} */
const char* GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR = "ShaderPositionTextureColor";
const char* GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP = "ShaderPositionTextureColor_noMVP";
const char* GLProgram::SHADER_NAME_POSITION_TEXTURE_ALPHA_TEST = "ShaderPositionTextureColorAlphaTest";
const char* GLProgram::SHADER_NAME_POSITION_TEXTURE_ALPHA_TEST_NO_MV = "ShaderPositionTextureColorAlphaTest_NoMV";
const char* GLProgram::SHADER_NAME_POSITION_COLOR = "ShaderPositionColor";
const char* GLProgram::SHADER_NAME_POSITION_COLOR_TEXASPOINTSIZE = "ShaderPositionColorTexAsPointsize";
const char* GLProgram::SHADER_NAME_POSITION_COLOR_NO_MVP = "ShaderPositionColor_noMVP";
const char* GLProgram::SHADER_NAME_POSITION_TEXTURE = "ShaderPositionTexture";
const char* GLProgram::SHADER_NAME_POSITION_TEXTURE_U_COLOR = "ShaderPositionTexture_uColor";
const char* GLProgram::SHADER_NAME_POSITION_TEXTURE_A8_COLOR = "ShaderPositionTextureA8Color";
const char* GLProgram::SHADER_NAME_POSITION_U_COLOR = "ShaderPosition_uColor";
const char* GLProgram::SHADER_NAME_POSITION_LENGTH_TEXTURE_COLOR = "ShaderPositionLengthTextureColor";
const char* GLProgram::SHADER_NAME_POSITION_GRAYSCALE = "ShaderUIGrayScale";
const char* GLProgram::SHADER_NAME_LABEL_DISTANCEFIELD_NORMAL = "ShaderLabelDFNormal";
const char* GLProgram::SHADER_NAME_LABEL_DISTANCEFIELD_GLOW = "ShaderLabelDFGlow";
const char* GLProgram::SHADER_NAME_LABEL_NORMAL = "ShaderLabelNormal";
const char* GLProgram::SHADER_NAME_LABEL_OUTLINE = "ShaderLabelOutline";
const char* GLProgram::SHADER_3D_POSITION = "Shader3DPosition";
const char* GLProgram::SHADER_3D_POSITION_TEXTURE = "Shader3DPositionTexture";
const char* GLProgram::SHADER_3D_SKINPOSITION_TEXTURE = "Shader3DSkinPositionTexture";
const char* GLProgram::SHADER_3D_POSITION_NORMAL = "Shader3DPositionNormal";
const char* GLProgram::SHADER_3D_POSITION_NORMAL_TEXTURE = "Shader3DPositionNormalTexture";
const char* GLProgram::SHADER_3D_SKINPOSITION_NORMAL_TEXTURE = "Shader3DSkinPositionNormalTexture";
const char* GLProgram::SHADER_3D_POSITION_BUMPEDNORMAL_TEXTURE = "Shader3DPositionBumpedNormalTexture";
const char* GLProgram::SHADER_3D_SKINPOSITION_BUMPEDNORMAL_TEXTURE = "Shader3DSkinPositionBumpedNormalTexture";
const char* GLProgram::SHADER_3D_PARTICLE_COLOR = "Shader3DParticleColor";
const char* GLProgram::SHADER_3D_PARTICLE_TEXTURE = "Shader3DParticleTexture";
const char* GLProgram::SHADER_3D_SKYBOX = "Shader3DSkybox";
const char* GLProgram::SHADER_3D_TERRAIN = "Shader3DTerrain";
const char* GLProgram::SHADER_CAMERA_CLEAR = "ShaderCameraClear";
これらのシェーダのshaderファイルはエンジンのrendererディレクトリの下にあり、fragはピクセルシェーダ、vertは頂点シェーダです.
//
#include "renderer/ccShader_Position_uColor.frag"
#include "renderer/ccShader_Position_uColor.vert"
//
#include "renderer/ccShader_PositionColor.frag"
#include "renderer/ccShader_PositionColor.vert"
//
#include "renderer/ccShader_PositionColorTextureAsPointsize.vert"
//
#include "renderer/ccShader_PositionTexture.frag"
#include "renderer/ccShader_PositionTexture.vert"
//
#include "renderer/ccShader_PositionTextureA8Color.frag"
#include "renderer/ccShader_PositionTextureA8Color.vert"
//
#include "renderer/ccShader_PositionTextureColor.frag"
#include "renderer/ccShader_PositionTextureColor.vert"
//
#include "renderer/ccShader_PositionTextureColor_noMVP.frag"
#include "renderer/ccShader_PositionTextureColor_noMVP.vert"
//
#include "renderer/ccShader_PositionTextureColorAlphaTest.frag"
//
#include "renderer/ccShader_PositionTexture_uColor.frag"
#include "renderer/ccShader_PositionTexture_uColor.vert"
#include "renderer/ccShader_PositionColorLengthTexture.frag"
#include "renderer/ccShader_PositionColorLengthTexture.vert"
#include "renderer/ccShader_UI_Gray.frag"
//
#include "renderer/ccShader_Label.vert"
#include "renderer/ccShader_Label_df.frag"
#include "renderer/ccShader_Label_df_glow.frag"
#include "renderer/ccShader_Label_normal.frag"
#include "renderer/ccShader_Label_outline.frag"
//
#include "renderer/ccShader_3D_PositionTex.vert"
#include "renderer/ccShader_3D_Color.frag"
#include "renderer/ccShader_3D_ColorTex.frag"
#include "renderer/ccShader_3D_PositionNormalTex.vert"
#include "renderer/ccShader_3D_ColorNormal.frag"
#include "renderer/ccShader_3D_ColorNormalTex.frag"
#include "renderer/ccShader_3D_Particle.vert"
#include "renderer/ccShader_3D_Particle.frag"
#include "renderer/ccShader_3D_Skybox.vert"
#include "renderer/ccShader_3D_Skybox.frag"
#include "renderer/ccShader_3D_Terrain.vert"
#include "renderer/ccShader_3D_Terrain.frag"
#include "renderer/ccShader_CameraClear.vert"
#include "renderer/ccShader_CameraClear.frag"
cococos 2 dxプログラムが起動すると、GLProgramCache::loadDefaultGLProgramsでこれらの内蔵シェーダをシステムにロードします.
void GLProgramCache::loadDefaultGLPrograms()
{
// Position Texture Color shader
GLProgram *p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_PositionTextureColor);
_programs.insert( std::make_pair( GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR, p ) );
// Position Texture Color without MVP shader
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_PositionTextureColor_noMVP);
_programs.insert( std::make_pair( GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP, p ) );
// Position Texture Color alpha test
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_PositionTextureColorAlphaTest);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_POSITION_TEXTURE_ALPHA_TEST, p) );
// Position Texture Color alpha test
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_PositionTextureColorAlphaTestNoMV);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_POSITION_TEXTURE_ALPHA_TEST_NO_MV, p) );
//
// Position, Color shader
//
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_PositionColor);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_POSITION_COLOR, p) );
// Position, Color, PointSize shader
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_PositionColorTextureAsPointsize);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_POSITION_COLOR_TEXASPOINTSIZE, p) );
//
// Position, Color shader no MVP
//
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_PositionColor_noMVP);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_POSITION_COLOR_NO_MVP, p) );
//
// Position Texture shader
//
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_PositionTexture);
_programs.insert( std::make_pair( GLProgram::SHADER_NAME_POSITION_TEXTURE, p) );
//
// Position, Texture attribs, 1 Color as uniform shader
//
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_PositionTexture_uColor);
_programs.insert( std::make_pair( GLProgram::SHADER_NAME_POSITION_TEXTURE_U_COLOR, p) );
//
// Position Texture A8 Color shader
//
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_PositionTextureA8Color);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_POSITION_TEXTURE_A8_COLOR, p) );
//
// Position and 1 color passed as a uniform (to simulate glColor4ub )
//
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_Position_uColor);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_POSITION_U_COLOR, p) );
//
// Position, Length(TexCoords, Color (used by Draw Node basically )
//
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_PositionLengthTexureColor);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_POSITION_LENGTH_TEXTURE_COLOR, p) );
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_LabelDistanceFieldNormal);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_LABEL_DISTANCEFIELD_NORMAL, p) );
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_LabelDistanceFieldGlow);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_LABEL_DISTANCEFIELD_GLOW, p) );
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_UIGrayScale);
_programs.insert(std::make_pair(GLProgram::SHADER_NAME_POSITION_GRAYSCALE, p));
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_LabelNormal);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_LABEL_NORMAL, p) );
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_LabelOutline);
_programs.insert( std::make_pair(GLProgram::SHADER_NAME_LABEL_OUTLINE, p) );
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DPosition);
_programs.insert( std::make_pair(GLProgram::SHADER_3D_POSITION, p) );
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DPositionTex);
_programs.insert( std::make_pair(GLProgram::SHADER_3D_POSITION_TEXTURE, p) );
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DSkinPositionTex);
_programs.insert(std::make_pair(GLProgram::SHADER_3D_SKINPOSITION_TEXTURE, p));
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DPositionNormal);
_programs.insert( std::make_pair(GLProgram::SHADER_3D_POSITION_NORMAL, p) );
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DPositionNormalTex);
_programs.insert( std::make_pair(GLProgram::SHADER_3D_POSITION_NORMAL_TEXTURE, p) );
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DSkinPositionNormalTex);
_programs.insert(std::make_pair(GLProgram::SHADER_3D_SKINPOSITION_NORMAL_TEXTURE, p));
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DPositionBumpedNormalTex);
_programs.insert(std::make_pair(GLProgram::SHADER_3D_POSITION_BUMPEDNORMAL_TEXTURE, p));
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DSkinPositionBumpedNormalTex);
_programs.insert(std::make_pair(GLProgram::SHADER_3D_SKINPOSITION_BUMPEDNORMAL_TEXTURE, p));
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DParticleColor);
_programs.insert(std::make_pair(GLProgram::SHADER_3D_PARTICLE_COLOR, p));
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DParticleTex);
_programs.insert(std::make_pair(GLProgram::SHADER_3D_PARTICLE_TEXTURE, p));
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DSkyBox);
_programs.insert(std::make_pair(GLProgram::SHADER_3D_SKYBOX, p));
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_3DTerrain);
_programs.insert(std::make_pair(GLProgram::SHADER_3D_TERRAIN, p));
p = new (std::nothrow) GLProgram();
loadDefaultGLProgram(p, kShaderType_CameraClear);
_programs.insert(std::make_pair(GLProgram::SHADER_CAMERA_CLEAR, p));
}
使用方法:
auto sprite = Sprite::create("HelloWorld.png");
auto shaderState = GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_COLOR);
sprite->setGLProgramState(shaderState);