Cocos2dx源码记录(2) CCRenderState

619 阅读2分钟

#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等类中使用.内部有对位枚举的使用方法