请问一个在Cocos2d-x中的OpenGL ES绘图问题

就我目前所知,如果要直接调用OpenGL ES API来绘图,至少有以下两种方法:


一、创建一个RenderTexture,在RenderTexture的范畴里边绘图,如:

bool TestNode::init() {
RenderTexture* rtx = RenderTexture::create(300, 300);

rtx->beginWithClear(1, 1, 1, 1);

_blendFunc = BlendFunc::ALPHA_PREMULTIPLIED;

setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_LENGTH_TEXTURE_COLOR));

_customCommand.init(rtx->getGlobalZOrder());

_customCommand.func = CC_CALLBACK_0(TestNode::onDraw, this);

Director::getInstance()->getRenderer()->addCommand(&_customCommand);

rtx->end();

this->addChild(rtx);

}

void TestNode::onDraw() {

getGLProgram()->use();

getGLProgram()->setUniformsForBuiltins();

GL::blendFunc(_blendFunc.src, _blendFunc.dst);

GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POSITION | GL::VERTEX_ATTRIB_FLAG_COLOR);

......

glVertexAttribPointer(......);

glVertexAttribPointer(......);

glDrawArrays(......);

}

<p> </p>
</p>
二、另一种是不使用RenderTexture,如:<br />
<pre class="brush:cpp; toolbar: true; auto-links: false;">bool TestNode::init() {

    _blendFunc = BlendFunc::ALPHA_PREMULTIPLIED;

    setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_LENGTH_TEXTURE_COLOR));

}


void TestNode::draw(Renderer *renderer, const Mat4 &transform, bool transformUpdated) {

    _customCommand.init(_globalZOrder);

    _customCommand.func = CC_CALLBACK_0(TestNode::onDraw, this, transform, transformUpdated);

    renderer->addCommand(&_customCommand);

}



void TestNode::onDraw(const Mat4 &transform, bool transformUpdated) {

    auto glProgram = getGLProgram();

    glProgram->use();

    glProgram->setUniformsForBuiltins(transform);

    GL::blendFunc(_blendFunc.src, _blendFunc.dst);

    GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POSITION | GL::VERTEX_ATTRIB_FLAG_COLOR);

    ......

    glVertexAttribPointer(......);

    glVertexAttribPointer(......);

    glDrawArrays(......);

}



请问就绘图而言,这两种方式的异同之处?

Thanks

第二种方法会直接渲染到framebuffer里,第一种方法是渲染到texture,最后由ccrendertexture渲染到framebuffer

谢谢你的回答。假设我创建一个继承自Node的子类,在这个子类里使用这两种绘图方式的其中一种,则在整个cocos2d-x的世界里,实质上有什么区别?我能想到的只有使用RenderTexture的效率可能会好一点?!

第一种方法在在一次渲染里使用太多会有内存的问题,不会有效率更好的可能