Я изменил свой код с 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.
Вы уверены, что знаете, что такое VAO и как его использовать? Почему ваша программа отключена при рисовании? Также почему вы активируете атрибутивные атрибуты при рендеринге? Вы не должны делать это при использовании VAO. это когда-то при настройке VAO.Черно, прочитайте, как использовать VAO. –
Хорошо, thx! Не знал этого, потому что здесь он отображается перед рендерингом: http://lwjgl.org/wiki/index.php?title=The_Quad_with_DrawArrays, но я думаю, что это потому, что это только renderd один раз. Я отключил свою программу при рисовании, чтобы убедиться, что это не мой шейдер (glsl-версия 130, причина отображения списков), которая вызывает проблемы. Я перепишу его и включу, когда VBOs работают. – Geosearchef
Посмотрите на этот учебник: http://www.swiftless.com/tutorials/opengl4/4-opengl-4-vao.html –