Вот таинственная проблема.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;
}
я могу включать в себя код, но для чего? Проблема решена, и мне больше не нужна помощь. Может быть, есть кнопка «Закрыть ответ»? (Я новичок в stackoverflow) –
Вы можете ответить на свой вопрос - http://stackoverflow.com/help/self-answer – fadden