#1 CCRenderState 定义当前设备的渲染状态,类似深度测试,模板测试,blend factor 和blend func 等等 这个类实际上还被定义为renderstate的管理类, 实际上用于记录状态的是其中的内部类:StateBlock. 这里先不做介绍,只要知道StateBlock持有一个_defaultState的静态变量,这个变量就是StateBlock的对象, 也被作为cocos渲染过程中的默认状态集合
void RenderState::initialize()
{
if (StateBlock::_defaultState == nullptr)
{
StateBlock::_defaultState = StateBlock::create();
CC_SAFE_RETAIN(StateBlock::_defaultState);
}
}
void RenderState::finalize()
{
CC_SAFE_RELEASE_NULL(StateBlock::_defaultState);
}
复制代码
initialize方法在Director对象创建时调用 及Director::reset() 重启时调用 另外, 实际上想 Material, Pass, Technique 三个类都是派生自RenderState类(主要现在只看到这三个).它们主要需要用到的估计是以下几个方法
/*在被作为父类构造方法调用时 会创建一个StateBlock对象 用于覆盖默认状态的影响*/
RenderState::RenderState()
: _texture(nullptr)
, _hash(0)
, _hashDirty(true)
, _parent(nullptr)
{
_state = StateBlock::create();
CC_SAFE_RETAIN(_state);
}
/*设置当前state绑定的纹理图 目前未知*/
void RenderState::setTexture(Texture2D* texture)
/*返回绑定的纹理图*/
Texture2D* RenderState::getTexture() const
/*说是绑定其实是在处理Pass前设置对应的RenderState*/
void RenderState::bind(Pass* pass)
/*返回根节点*/
RenderState* RenderState::getTopmost(RenderState* below)
复制代码
##1.2 Blend
//混合参数
enum Blend
{
BLEND_ZERO = GL_ZERO,
BLEND_ONE = GL_ONE,
BLEND_SRC_COLOR = GL_SRC_COLOR,
BLEND_ONE_MINUS_SRC_COLOR = GL_ONE_MINUS_SRC_COLOR,
BLEND_DST_COLOR = GL_DST_COLOR,
BLEND_ONE_MINUS_DST_COLOR = GL_ONE_MINUS_DST_COLOR,
BLEND_SRC_ALPHA = GL_SRC_ALPHA,
BLEND_ONE_MINUS_SRC_ALPHA = GL_ONE_MINUS_SRC_ALPHA,
BLEND_DST_ALPHA = GL_DST_ALPHA,
BLEND_ONE_MINUS_DST_ALPHA = GL_ONE_MINUS_DST_ALPHA,
BLEND_CONSTANT_ALPHA = GL_CONSTANT_ALPHA,
BLEND_ONE_MINUS_CONSTANT_ALPHA = GL_ONE_MINUS_CONSTANT_ALPHA,
BLEND_SRC_ALPHA_SATURATE = GL_SRC_ALPHA_SATURATE
};
复制代码
//深度测试方法
enum DepthFunction
{
DEPTH_NEVER = GL_NEVER,
DEPTH_LESS = GL_LESS,
DEPTH_EQUAL = GL_EQUAL,
DEPTH_LEQUAL = GL_LEQUAL,
DEPTH_GREATER = GL_GREATER,
DEPTH_NOTEQUAL = GL_NOTEQUAL,
DEPTH_GEQUAL = GL_GEQUAL,
DEPTH_ALWAYS = GL_ALWAYS
};
复制代码
//抛弃参数, 指定是向前面片丢弃还是向后面片丢弃, 至于向前还是向后由顶点渲染顺序决定
enum CullFaceSide
{
CULL_FACE_SIDE_BACK = GL_BACK,
CULL_FACE_SIDE_FRONT = GL_FRONT,
CULL_FACE_SIDE_FRONT_AND_BACK = GL_FRONT_AND_BACK
};
复制代码
//决定之前的faceSize , 是顺时针顺序是前还是逆时针顺序是前
enum FrontFace
{
FRONT_FACE_CW = GL_CW,
FRONT_FACE_CCW = GL_CCW
};
复制代码
//模板测试方法
enum StencilFunction
{
STENCIL_NEVER = GL_NEVER,
STENCIL_ALWAYS = GL_ALWAYS,
STENCIL_LESS = GL_LESS,
STENCIL_LEQUAL = GL_LEQUAL,
STENCIL_EQUAL = GL_EQUAL,
STENCIL_GREATER = GL_GREATER,
STENCIL_GEQUAL = GL_GEQUAL,
STENCIL_NOTEQUAL = GL_NOTEQUAL
};
复制代码
//决定你模板测试通过后的行为(为什么没有深度测试后的行为?确定不需要)
enum StencilOperation
{
STENCIL_OP_KEEP = GL_KEEP,
STENCIL_OP_ZERO = GL_ZERO,
STENCIL_OP_REPLACE = GL_REPLACE,
STENCIL_OP_INCR = GL_INCR,
STENCIL_OP_DECR = GL_DECR,
STENCIL_OP_INVERT = GL_INVERT,
STENCIL_OP_INCR_WRAP = GL_INCR_WRAP,
STENCIL_OP_DECR_WRAP = GL_DECR_WRAP
};
复制代码
#2 StateBlock 实际保存对应渲染状态 的类
//是否开启对应参数的位移枚举, 由_bits成员变量保存
enum
{
RS_BLEND = (1 << 0),
RS_BLEND_FUNC = (1 << 1),
RS_CULL_FACE = (1 << 2),
RS_DEPTH_TEST = (1 << 3),
RS_DEPTH_WRITE = (1 << 4),
RS_DEPTH_FUNC = (1 << 5),
RS_CULL_FACE_SIDE = (1 << 6),
// RS_STENCIL_TEST = (1 << 7),
// RS_STENCIL_WRITE = (1 << 8),
// RS_STENCIL_FUNC = (1 << 9),
// RS_STENCIL_OP = (1 << 10),
RS_FRONT_FACE = (1 << 11),
RS_ALL_ONES = 0xFFFFFFFF,
};
//StateBLock持有的默认状态
static StateBlock* _defaultState;
复制代码
总结: 这是个非常重要的类,将在后面的CCRenderer, CCRenderCommand等类中使用.内部有对位枚举的使用方法