人造人.NDK.OpenGLES2.神秘地无法绘制

Android. NDK. OpenGLES2. Mysteriously not working drawing

本文关键字:绘制 NDK OpenGLES2 人造人      更新时间:2023-10-16

这里有一些神秘的问题。

// There are in global space
VertexBufferGLES2 vb(true);
IndexBufferGLES2 ib(true);
...
// Initialization
vb.Create(sizeof(tris), tris, USAGE_STATIC_);
ib.Create(sizeof(indices), indices, USAGE_STATIC);
...
glBindBuffer(GL_ARRAY_BUFFER, vb.GetVertexBufferGLES2());
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib.GetIndexBufferGLES2());
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (GLvoid *)0);

在这种情况下,一切都可以完美运行,但是使用下面的代码,什么都不是绘图。

// There are in global space
VertexBufferGLES2 *vb = NULL;
IndexBufferGLES2 *ib = NULL;
...
// Initialization
vb = new VertexBufferGLES2(true);
ib = new IndexBufferGLES2(true);
vb->Create(sizeof(tris), tris, USAGE_STATIC_);
ib->Create(sizeof(indices), indices, USAGE_STATIC);
...
glBindBuffer(GL_ARRAY_BUFFER, vb->GetVertexBufferGLES2());
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib->GetIndexBufferGLES2());
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (GLvoid *)0);
...
delete vb;
delete ib;

所有其他代码都是相同的。只有这两段代码不同。我已经三天在等待修复,但什么也没找到,因为这段代码在逻辑上是如此明显和逻辑上相同,一定是......

问题解决了:在函数"create"中,我在从"create"函数参数为其赋值之前使用成员变量(enum)。在第一种情况下,编译器将此变量初始化为 0,这对于代码来说是正确的(因为这是第一个枚举值),并且一切正常。在第二种情况下,编译器不初始化变量,因为类是在堆上创建的,其中变量是垃圾。

我的错误在于这段代码:

int VertexBufferGLES2::Create(int size, void *data, USAGE_ usage)
{
    if (size == 0) return -1;
    Delete();
    m_size = size;
    glGenBuffers(1, &m_buffer);
    glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
    // The function GetGLES2Usage() is mapping my m_usage enum to
    // OpenGL ES 2 enum
    glBufferData(GL_ARRAY_BUFFER, size, data, GetGLES2Usage());
    // but the value to m_usage i assign here. Moving up (to above   
    // glBufferData line) this code line solves the problem  
    m_usage = usage;
    if (m_useCache) CacheData(size, data);
    return 0;
}

VertexBufferGLES2 vb = NULL;
IndexBufferGLES2 ib = NULL;

看起来很可疑,也许你应该尝试一下

VertexBufferGLES2* vb = NULL;
IndexBufferGLES2* ib = NULL;