2014-09-18 5 views
0

Я изменил свой код с DisplayLists на VBOs/VAO. Но когда я запускаю приложение, он падает.VAO и VBO Сбой при рисовании

Он падает, когда при первой попытке нарисовать VAO. Я рисую без шейдеров (так что это не вызывает проблем).

В одном VAO и текстурных координатах есть до 12 граней (12 * 3 вершины). До 500 000 ВАО.

Как я создать лицо:

tData.add(new float[]{textureX + 0.1249f, textureY+ 0.1249f}); 
vData.add(new float[]{x, y, z}); 
tData.add(new float[]{textureX+ 0.1249f, textureY+0.0001f}); 
vData.add(new float[]{x, y+1, z+1}); 
tData.add(new float[]{textureX+0.0001f, textureY+0.0001f}); 
vData.add(new float[]{x+1, y+1, z+1}); 

Создание в VBO/ВАО:

if(vData.isEmpty()) 
     return; 

    int vaoHandle = glGenVertexArrays(); 
    glBindVertexArray(vaoHandle); 

    int vertexDataSize = vData.size() * 3; 
    int textureDataSize = tData.size() * 2; 
    FloatBuffer vertexData = BufferUtils.createFloatBuffer(vData.size() * 3); 
    FloatBuffer textureData = BufferUtils.createFloatBuffer(tData.size() * 2); 

    while(!vData.isEmpty()) 
    { 
     vertexData.put(vData.remove(0)); 
    } 
    while(!tData.isEmpty()) 
    { 
     textureData.put(tData.remove(0)); 
    } 

    vertexData.flip(); 
    textureData.flip(); 

    int vertexHandle = glGenBuffers(); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexHandle); 
    glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW); 
    glVertexAttribPointer(0, vertexDataSize, GL_FLOAT, false, 0, 0); 

    int textureHandle = glGenBuffers(); 
    glBindBuffer(GL_ARRAY_BUFFER, textureHandle); 
    glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW); 
    glVertexAttribPointer(1, textureDataSize, GL_FLOAT, false, 0, 0); 


    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindVertexArray(0); 

    renderEngine.vaos.add(new VAO(vaoHandle, (int)((float)vertexDataSize/3f))); 

Rendering в VBO/ВАО:

glUseProgram(0);//TODO:REMOVE 
    for(VAO vao : vaos) 
    { 
     glBindVertexArray(vao.getHandle()); 
     glEnableVertexAttribArray(0); 
     glEnableVertexAttribArray(1); 

     System.out.println(vao.getVertices());//correct numeber 
     glDrawArrays(GL_TRIANGLES, 0, vao.getVertices());//<-- CRASH at first time called 

     glDisableVertexAttribArray(1); 
     glDisableVertexAttribArray(0); 
    } 
    glBindVertexArray(0); 

Вот ошибка:

# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000000b3fb610, pid=7736, tid=6224 
# 
# JRE version: Java(TM) SE Runtime Environment (8.0_20-b26) (build 1.8.0_20-b26) 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.20-b23 mixed mode windows-amd64 compressed oops) 
# Problematic frame: 
# C [ig75icd64.dll+0x8b610] 
# 
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows 
# 
# An error report file with more information is saved as: 
# C:\Users\Geosearchef\workspaces\workspaceLWJGL\OrangeJuiceVBO\hs_err_pid7736.log 
# 
# If you would like to submit a bug report, please visit: 
# http://bugreport.sun.com/bugreport/crash.jsp 
# The crash happened outside the Java Virtual Machine in native code. 
# See problematic frame for where to report the bug. 
# 

Я не думаю, что здесь есть смысл публиковать всю ошибку. У вас есть идеи, почему это происходит? Я ничего не могу найти об этой ошибке относительно VBOs.

+0

Вы уверены, что знаете, что такое VAO и как его использовать? Почему ваша программа отключена при рисовании? Также почему вы активируете атрибутивные атрибуты при рендеринге? Вы не должны делать это при использовании VAO. это когда-то при настройке VAO.Черно, прочитайте, как использовать VAO. –

+0

Хорошо, thx! Не знал этого, потому что здесь он отображается перед рендерингом: http://lwjgl.org/wiki/index.php?title=The_Quad_with_DrawArrays, но я думаю, что это потому, что это только renderd один раз. Я отключил свою программу при рисовании, чтобы убедиться, что это не мой шейдер (glsl-версия 130, причина отображения списков), которая вызывает проблемы. Я перепишу его и включу, когда VBOs работают. – Geosearchef

+0

Посмотрите на этот учебник: http://www.swiftless.com/tutorials/opengl4/4-opengl-4-vao.html –

ответ

0

Вы не установите вершину правильно приписывать указатели:

int vertexDataSize = vData.size() * 3; 
int textureDataSize = tData.size() * 2; 
[...] 
glVertexAttribPointer(0, vertexDataSize, GL_FLOAT, false, 0, 0); 
[...] 
glVertexAttribPointer(1, textureDataSize, GL_FLOAT, false, 0, 0); 

Параметр size определяет количество элементов в векторе каждой вершины, и должно быть в диапазоне от 1 до 4.

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

Другая проблема здесь: вы используете общие атрибуты вершины 0 и 1, но вы не используете шейдеры. Это не сработает. Спектр только гарантирует, что индекс атрибута 0 будет сопоставляться с классическим атрибутом glVertex, но атрибут 1 может быть чем угодно или вообще не работать.

+0

Он делает еще много неправильных вещей в своем коде. Использование VAO в коде чертежа совершенно неверно. –

+0

Код чертежа не является правильным в строгом смысле слова. Это просто неэффективно. – derhass

+0

Я изменил создание VBO, чтобы сделать один VBO для каждого треугольника, теперь он работает. Thx за вашу помощь! Я все еще не понимаю, что должно быть лучше с использованием VBOs по сравнению с DisplayList. У меня еще 3 FPS (displaylist: 70). Это моя вторая попытка с VBOs, такой же результат. Я делаю что-то, что бесчувственное? – Geosearchef