Cocos2dx源码记录(2) CCRenderState

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

转载于:https://juejin.im/post/5a30dd446fb9a04511711eb7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值