2015-03-17 4 views
0

Вот таинственная проблема.Android. NDK. OpenGLES2. Таинственно не работает Рисунок

// 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; 

Все остальные коды идентичны. Отличается только этим двумя частями кода. Я уже три дня искал исправления, но ничего не найдено, потому что этот код настолько обволен и логически идентичен, должно быть ...

Проблема решена: в функции «создать» я использую переменную-член (enum) перед назначением ему значения из параметров «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; 
} 
+0

я могу включать в себя код, но для чего? Проблема решена, и мне больше не нужна помощь. Может быть, есть кнопка «Закрыть ответ»? (Я новичок в stackoverflow) –

+0

Вы можете ответить на свой вопрос - http://stackoverflow.com/help/self-answer – fadden

ответ

1

Линии

VertexBufferGLES2 vb = NULL; 
IndexBufferGLES2 ib = NULL; 

выглядеть подозрительно, может быть, вы должны попробовать

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

Прошу прощения. Это опечатка. Я исправил. Благодарю за внимание. –

Смежные вопросы