Использование glDrawRangeElements в OpenGL 2.1 - PullRequest
2 голосов
/ 06 октября 2011

Основано на информации в Вопросы о glDrawRangeElements () и заданы следующие элементы:

struct MyVertex
{
   GLfloat x, y, z;        //Vertex
};

const GLushort pindices[] = { 0, 1, 2, 3, 5, 4 };

struct MyVertex pvertex[6];
//VERTEX 0
pvertex[0].x = 0.0;
pvertex[0].y = 0.0;
pvertex[0].z = 0.0;
//VERTEX 1
pvertex[1].x = 1.0;
pvertex[1].y = 0.0;
pvertex[1].z = 0.0;
//VERTEX 2
pvertex[2].x = 0.0;
pvertex[2].y = 1.0;
pvertex[2].z = 0.0;
//VERTEX 3
pvertex[3].x = 0.0;
pvertex[3].y = 0.0;
pvertex[3].z = 0.0;
//VERTEX 4
pvertex[4].x = 1.0;
pvertex[4].y = 0.0;
pvertex[4].z = 0.0;
//VERTEX 5
pvertex[5].x = 0.0;
pvertex[5].y = -1.0;
pvertex[5].z = 0.0;

и следующая инициализация:

glGenBuffers(1, &VertexVBOID);
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBufferData(GL_ARRAY_BUFFER, sizeof(struct MyVertex)*3, &pvertex[0].x, GL_STATIC_DRAW);
glVertexPointer(3, GL_FLOAT, sizeof(struct MyVertex), BUFFER_OFFSET(0));

glGenBuffers(1, &IndexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*3, pindices, GL_STATIC_DRAW);

glEnableClientState(GL_VERTEX_ARRAY);

следующие звонки:

glDrawRangeElements(GL_TRIANGLES, 0, 2, 3, GL_UNSIGNED_SHORT, (const GLvoid*) pindices);
glDrawRangeElements(GL_TRIANGLES, 3, 5, 3, GL_UNSIGNED_SHORT, (const GLvoid*) pindices+3);

должен нарисовать два треугольника. Тем не менее, я получаю EXE_BAD_ACCESS. Если я использую pindices [0] в glDrawRangeElements; Я получаю треугольник, определенный первыми тремя индексами. Использование pindices [3] во втором вызове glDrawRangeElements не приводит к рисованию чего-либо, и я не получаю никаких ошибок OpenGl. Ни разу второй вызов glDrawRangeElements не рисует перевернутый треугольник, определенный тремя последними вершинами. Я чувствую, что упускаю что-то фундаментальное в отношении использования указателей здесь, но я пока не смог понять это. Мысли?

1 Ответ

2 голосов
/ 06 октября 2011

Ваши проблемы не имеют прямого отношения к glDrawRangeElements, но связаны с неправильным использованием VBO.

Прежде всего, при использовании VBO (или, точнее, при привязке VBO к GL_ELEMENT_ARRAY_BUFFER), аргумент указателя индекса на glDraw... интерпретируется как смещение байта в буфер, связанный с точкой привязки GL_ELEMENT_ARRAY_BUFFER (индексный буфер), аналогично тому, как GL_ARRAY_BUFFER влияет на аргумент массива glVertexPointer. Поэтому плохой доступ. Поэтому замените (const GLvoid*)pindices на 0 в первом вызове glDrawRangeElements. Второй вызов в любом случае неверен, так как вы не можете сделать арифметику указателя для пустого указателя (он даже не должен компилироваться, какой размер должен быть увеличен на «bytes? Shorts»). Поэтому во втором вызове используйте (const GLushort*)0+3, чтобы получить смещение в байтах до 4-го индекса в буфере индекса.

Во-вторых, ваши буферы содержат только половину необходимых данных, так как вы используете sizeof(...)*3 в обоих glBufferData вызовах, но ваши массивы на самом деле содержат 6 элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...