2013-12-13 3 views
-1

Я работаю над тем, что в конечном итоге станет ящиком местности, однако на данный момент я просто пытаюсь получить базовую пару треугольников для рисования с помощью glDrawElements. Код выглядит так:glDrawElements Не удается нарисовать

общественного класса TerrainFlat расширяет AbstractTerrain {

IntBuffer ib = BufferUtils.createIntBuffer(3); 

int vHandle = ib.get(0); 
int cHandle = ib.get(1); 
int iHandle = ib.get(2); 

FloatBuffer vBuffer = BufferUtils.createFloatBuffer(19); 
FloatBuffer cBuffer = BufferUtils.createFloatBuffer(18); 
ShortBuffer iBuffer = BufferUtils.createShortBuffer(6); 


@Override 
public void initilize(){ 


    float[] vertexData = {50, 20, 100,  50, -20, 100,  10, -20, 100,    -10, -20, 100,  -50, -20, 100,  -50, 20, 100}; 
    float[] colorData = {1, 0, 0, 0, 1, 0, 0, 0, 1, 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 }; 
    short[] indexData = {0,1,2,3,4,5}; 

    vBuffer.put(vertexData); 
    vBuffer.flip(); 


    cBuffer.put(colorData); 
    cBuffer.flip(); 


    iBuffer.put(indexData); 
    iBuffer.flip(); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 

    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iHandle); 
    glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iBuffer, GL_STATIC_DRAW_ARB); 
    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); 

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle); 
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, vBuffer, GL_STATIC_DRAW_ARB); 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 


    glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle); 
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, cBuffer, GL_STATIC_DRAW_ARB); 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 






} 

@Override 
public void setUp(float posX, float posY, float posZ){ 



} 

@Override 
public void draw(){ 

        glClear(GL_COLOR_BUFFER_BIT); 

    glGenBuffersARB(ib); 
    vHandle = ib.get(0); 
    cHandle = ib.get(1); 
    iHandle = ib.get(2); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle); 
    glVertexPointer(3, GL_FLOAT, 3 << 2 , 0L); 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle); 
    glColorPointer(3, GL_FLOAT, 3 << 2 , 0L); 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 

    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iHandle); 

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0L); 

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 
    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); 


} 

@Override 
public void destroy(){ 
    ib.put(0, vHandle); 
    ib.put(1, cHandle); 
    ib.put(2, iHandle); 
    glDeleteBuffersARB(ib); 
} 



} 

Это ничего не сделать, экран полностью черный. GL_CULL_FACE не включен, и нет освещения (или его отсутствия), чтобы вызвать эту ошибку. Перемещение привязки данных в функцию Draw() позволяет ему работать (если вы хотите, я могу добавить этот код к этому). Это, однако, означает, что я создаю каждую функцию рисования буфера (т.е.: плохой). Мне интересно, что я здесь делаю неправильно, потому что я переместил его и ударил глупо 4 дня.

+0

Я уверен, что вы не должны генерировать новые РВО каждый раз, когда вы рисуете. Нет, если вы хотите, чтобы они использовали данные, сгенерированные вами в 'initialize (...)'. Я бы серьезно подумал о переходе вызова на 'glGenBuffersARB (...)' в 'initialize (...)'. Тем не менее, почему вы используете расширение ARB для объектов буфера? Они были ядром с OpenGL 1.5. –

+0

Я решил это, как только прошло 8 часов. Я отправлю решение. – Peter

+0

В обоих случаях ваш шаг данных с буфером должен быть равен нулю. –

ответ

1

Вы установка vHandle, cHandle и iHandle 0.

Вам не нужно, чтобы создать IntBuffer в строке 1 в любом случае. Заменить

int vHandle = ib.get(0); 
int cHandle = ib.get(1); 
int iHandle = ib.get(2); 

с

int vHandle = glGenBuffers(); 
int cHandle = glGenBuffers(); 
int iHandle = glGenBuffers(); 
+0

Это не решит проблему, потому что OP все равно генерирует новые буферы каждый раз, когда вызывается 'draw (...)'. В конце концов реализация GL будет исчерпана из имен, чтобы выдавать, а не то, что имена для пустых буферов делают много хорошего в первую очередь. Часть решения состоит в том, чтобы переместить не-пробельные строки 2-5 из 'draw (...)' в 'initialize (...)'. –

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