就我目前所知,如果要直接调用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