【发布时间】:2015-05-20 08:07:36
【问题描述】:
这是一个神秘的问题。
// 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”函数参数中为其赋值。在第一种情况下,编译器将此变量初始化为 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;
}
【问题讨论】:
-
我可以包含代码,但是为了什么?问题解决了,我不再需要帮助了。也许有一些按钮“关闭答案”? (我是 stackoverflow 的新手)
-
你可以回答你自己的问题 -- stackoverflow.com/help/self-answer
标签: android c++ opengl-es android-ndk