2014-09-18 97 views
0

我將代碼從DisplayLists更改爲VBOs/VAO。 但是,當我運行該應用程序它崩潰。VAO和VBO在繪圖時崩潰

它在第一次嘗試繪製VAO時崩潰。我正在繪製不使用着色器(所以它不會導致問題)。

在一個VAO中有多達12個面(12 * 3個頂點)和這些面的紋理座標。有多達500 000個VAO。

我如何生成一個面:

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/VAO:

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))); 

渲染VBO/VAO:

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. 
# 

我不認爲在這裏發佈整個錯誤是有道理的。 你知道爲什麼會發生這種情況嗎?我無法找到關於維也納組織的這一錯誤的任何信息。

+0

你確定你明白什麼是VAO以及如何使用它?爲什麼你的程序在你繪製時沒有被綁定?還有,爲什麼在渲染過程中enable.disable attrib數組?你在使用VAO時不能這樣做。那些曾經設置VAO的人。稍後,閱讀如何使用VAO。 – 2014-09-18 19:54:16

+0

好的,thx!不知道這一點,因爲它在渲染前顯示:http://lwjgl.org/wiki/index.php?title=The_Quad_with_DrawArrays,但我認爲這是因爲它只渲染一次。我在繪圖時解除了我的程序,以確保它不是我着色器(glsl版本130,顯示列表的原因)導致的問題。我將重寫它,並在維也納國際組織工作時啓用它。 – Geosearchef 2014-09-18 19:57:33

+0

查看本教程:http://www.swiftless.com/tutorials/opengl4/4-opengl-4-vao.html – 2014-09-18 19:59:34

回答

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

Y我們的代碼只會生成一個GL錯誤 - 並且您應該明確地添加一些錯誤檢查,至少對於調試 - 並且保留屬性指針未初始化。

另一個問題在於:您使用泛型頂點屬性0和1,但不使用着色器。這是行不通的。規範只保證屬性索引0將映射到經典的glVertex屬性,但屬性1可能是任何東西,或根本不起作用。

+0

他在代碼中做了更多錯誤的事情。他在繪圖代碼中使用VAO是完全錯誤的。 – 2014-09-18 19:56:31

+0

嚴格意義上的繪圖代碼沒有錯。這只是效率低下。 – derhass 2014-09-18 19:58:53

+0

我改變了VBO的創建,使每個三角形的一個VBO,現在它的工作。 Thx爲您提供幫助!我仍然不明白,與DisplayList相比,使用VBO應該更好。我還有3個FPS(顯示列表:70)。這是我與維也納國際組織的第二次嘗試,結果相同。我在做些什麼東西? – Geosearchef 2014-09-18 20:04:35