Ошибка сегментации glDrawElements - PullRequest
0 голосов
/ 05 февраля 2012

Я сейчас пытаюсь нарисовать объект с помощью VBO.В Cube-Class, который я придумал для проверки функциональности VBO, я создаю VBO следующим образом:

//Vertex
glGenBuffers(1, &m_bufVertex);
glBindBuffer(GL_ARRAY_BUFFER, m_bufVertex);
glBufferData(GL_ARRAY_BUFFER, 6*4*3*sizeof(GLfloat), vertex_data, GL_STATIC_DRAW);
//TexCoord
glGenBuffers(1, &m_bufTexCoord);
glBindBuffer(GL_ARRAY_BUFFER, m_bufTexCoord);
glBufferData(GL_ARRAY_BUFFER, 6*4*2*sizeof(GLfloat), texcoord_data, GL_STATIC_DRAW);
//Index
glGenBuffers(1,&m_bufIndex);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,m_bufIndex);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,24*sizeof(GLuint), indices, GL_STATIC_DRAW);

Я уже дважды проверил, находятся ли данные в буферах, например, вот так (буфер вершин)привязывается в это время):

GLfloat* test = (GLfloat *) glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
for (unsigned int i = 0; i < 6*4*3; i++)
    cout << "Value " << i << " = " << test[i] << endl;

Таким образом, данные находятся там, где они должны быть, поэтому проблема, похоже, лежит в функции рендеринга.Ошибка сегментации возникает при вызове glDrawElements () или glDrawArrays ().Вот код:

glBindTexture(GL_TEXTURE_2D, m_texture);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// some translation, currently fixed, just testing code
glTranslatef(0.0f, 0.0f, -200.0f);
glRotatef(30.f, 1.f, 0.f, 0.f);
glRotatef(30.f, 0.f, 1.f, 0.f);
glRotatef(30.f, 0.f, 0.f, 1.f);
// enable client states
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// set pointers
glBindBuffer(GL_ARRAY_BUFFER, m_bufVertex);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, m_bufTexCoord);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_bufIndex);
// just error check to see if something went wrong previously
GLenum err = glGetError();
if (GL_NO_ERROR != err)
    cout << "GL: " << err << " - " << gluErrorString(err) << endl;
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, 0);
// disable state and pop matrix
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();

Я предполагаю, что я использую указатели не правильно или glDrawElements (), но я не знаю что.Еще некоторые сведения: код скомпилирован на MacOSX Lion (OpenGL2.1) с использованием GNU-toolchain и GLEW.

EDIT:

GLfloat vertex_data[6*4*3] = {-m_fSize, -m_fSize, -m_fSize,
                       -m_fSize,  m_fSize, -m_fSize,
                        m_fSize,  m_fSize, -m_fSize,
                        m_fSize, -m_fSize, -m_fSize,
                        -m_fSize, -m_fSize, m_fSize,
                        -m_fSize,  m_fSize, m_fSize,
                         m_fSize,  m_fSize, m_fSize,
                         m_fSize, -m_fSize, m_fSize,
                       -m_fSize, -m_fSize, -m_fSize,
                       -m_fSize,  m_fSize, -m_fSize,
                       -m_fSize,  m_fSize,  m_fSize,
                       -m_fSize, -m_fSize,  m_fSize,
                        m_fSize, -m_fSize, -m_fSize,
                        m_fSize,  m_fSize, -m_fSize,
                        m_fSize,  m_fSize,  m_fSize,
                        m_fSize, -m_fSize,  m_fSize,
                       -m_fSize, -m_fSize,  m_fSize,
                       -m_fSize, -m_fSize, -m_fSize,
                        m_fSize, -m_fSize, -m_fSize,
                        m_fSize, -m_fSize,  m_fSize,
                        -m_fSize, m_fSize,  m_fSize,
                        -m_fSize, m_fSize, -m_fSize,
                         m_fSize, m_fSize, -m_fSize,
                        m_fSize, m_fSize,  m_fSize};
 GLfloat texcoord_data[6*4*2] = {0, 0, 0, 1, 1, 1, 1, 
                                0, 0, 0, 0, 1, 1, 1, 
                                1, 0, 0, 0, 0, 1, 1, 
                                1, 1, 0, 0, 0, 0, 1,
                                1, 1, 1, 0, 0, 1, 0, 
                                0, 1, 0, 1, 1, 0, 1,
                                0, 0, 1, 0, 1, 1};
GLuint indices[24] = {0,1,2,3,
                     4,5,6,7,
                     8,9,10,11,
                     12,13,14,15,
                     16,17,18,19,
                     20,21,22,23};

Я знаю, что я определяю каждую вершину, а не просто8 ...

EDIT2: Makefile:

OUT = bin/test
CC = g++
INCDIR = inc
OBJDIR = obj
SRCDIR = src
INC = -I$(INCDIR) -I/opt/local/include
LIBS = -L/opt/local/lib -lGLEW -lsfml-graphics -lsfml-window -lsfml-system -framework AGL -framework OpenGL -framework Foundation

_OBJS = Main.o \
    Timer.o \
    Cube.o \
    chrono.o process_cpu_clocks.o thread_clock.o error_code.o

OBJS = $(patsubst %,$(OBJDIR)/%,$(_OBJS))

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp 
$(CC) -c $(INC) -o $@ $< $(CFLAGS) 


$(OUT): $(OBJS)
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
strip $(OUT)

clean:
rm -f $(OBJDIR)/*.o $(OUT)

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

У меня была точно такая же проблема. Проблема в том, что SFML внутренне использует glEnableClientState (GL_COLOR_ARRAY) и glEnableClientState (GL_TEXTURE_COORD_ARRAY); поэтому вам нужно отключить их, если вы сами их не используете.

Или вы можете использовать sf :: Window вместо sf :: RenderWindow, поскольку он не устанавливает внутреннее состояние OpenGL, что я и выбрал.

Пост на форуме SFML с этой точной проблемой

1 голос
/ 06 февраля 2012

Возможно ли, что вы оставили включенный массив вершин в предыдущем розыгрыше?Например, если вы сделаете что-то вроде этого:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(...);
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(...);
glDrawElements(...); // draw first object

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(...);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(...);
glDrawElements(...); // draw second object

Второй glDrawElements может аварийно завершить работу, потому что нормальный массив все еще включен, но, вероятно, не подходит для второго рисования.

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