【问题标题】:glDrawArrays with cocos2d not drawing at all带有cocos2d的glDrawArrays根本不绘图
【发布时间】:2018-02-06 13:01:51
【问题描述】:

我有很多点需要批量绘制,我已经尝试了两天,但 glDrawArrays 似乎没有任何进展。我已经尝试过 DrawNode 并绘制每个单独的点进行测试,它工作正常......但我似乎无法让 glDrawArray 给出任何视觉结果。

这是我的绘图代码(更改了几个变量名):

auto glProgram = getGLProgram();
if (glProgram == nullptr) {
    setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(
            GLProgram::SHADER_NAME_POSITION_COLOR));
    glProgram = getGLProgram();
    if (glProgram == nullptr) {
        return;
    }
}
glProgram->use();
glProgram->setUniformsForBuiltins();

GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POSITION | GL::VERTEX_ATTRIB_FLAG_COLOR);
GLfloat *vertices = new GLfloat[myStruct->data.size()*2];
GLfloat *colors   = new GLfloat[myStruct->data.size()*4];
int vIndex = 0;
int cIndex = 0;
for (std::vector<myPointStruct*>::iterator it = myStruct->data.begin(); it != myStruct->data.end(); ++it) {
    vertices[vIndex++] = (*it)->pos.x;
    vertices[vIndex++] = (*it)->pos.y;
    colors[cIndex++] = (*it)->color.r;
    colors[cIndex++] = (*it)->color.g;
    colors[cIndex++] = (*it)->color.b;
    colors[cIndex++] = (*it)->color.a;
glLineWidth(10);
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat), &vertices[0]);
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat), &colors[0]);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDrawArrays(GL_POINTS, 0, (GLsizei) myStruct->data.size());
CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,  (GLsizei) myStruct->data.size());

这是我如何调用该方法:

_renderTexture->begin();
myMethodForDrawing();
_renderTexture->end();
Director::getInstance()->getRenderer()->render();

我也试过了:

_renderTexture->begin();
_customCommand.init(_renderTexture->getGlobalZOrder());
_customCommand.func = CC_CALLBACK_0(MyClass:: myMethodForDrawing,this);
auto renderer = Director::getInstance()->getRenderer();
renderer->addCommand(&_customCommand);
_renderTexture->end();

【问题讨论】:

    标签: c++ opengl cocos2d-x opengl-3


    【解决方案1】:

    glVertexAttribPointer 的第 5 个参数指定连续通用顶点属性之间的字节偏移量。如果stride 为0,则通用顶点属性被理解为紧密封装在数组中。

    由于你的顶点和颜色是紧密排列的,你不需要设置 stride 参数。请注意,sizeof(GLfloat) 无论如何都是错误的。在您的情况下,vertices2 * sizeof(GLfloat)colors4 * sizeof(GLfloat)

    像这样更改您的代码(关注第 5 个参数的 0):

    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, &vertices[0]);
    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_FLOAT, GL_FALSE, 0, &colors[0]);
    

    【讨论】:

    • 感谢您的回复。我之前也尝试过,它似乎仍然没有显示任何内容......代码还有其他问题吗?或者有没有办法查看它是否正在绘制但不在前面?还是在另一个画布对象之上?如果代码正确,我有点不知道如何调试它。
    • @TaimoorAbdullahKhan 在您的代码中没有其他明显的问题。但是可能会有很多问题。尝试禁用深度测试glDisable(GL_DEPTH_TEST)。另一个流行的问题是投影矩阵。可能是您的几何体对于投影来说太小或超出了剪辑空间。
    • 我会一一查看并检查它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多