当前位置: 首页 > 知识库问答 >
问题:

绘制时VAO和VBO崩溃

洪弘亮
2023-03-14

当第一次尝试绘制VAOS时,它崩溃了。我画没有着色器(所以它不会引起问题)。

在一个VAO和纹理坐标中最多有12个面(12*3个顶点)。有多达50万个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});
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)));
    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的错误。

共有1个答案

麹承
2023-03-14

没有正确设置顶点属性指针:

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错误--您应该明确地添加一些错误检查,至少为了调试--并保持属性指针未初始化。

 类似资料:
  • 在我的理解中:一个VAO代表一个特定的状态。如果我绑定了一个VAO,添加一些VBO和元素缓冲区,用于索引和东西,我可以保存我想绘制和激活的对象的某个状态,然后在我想渲染东西的时候轻松地绘制它们。对吧? 所以VBO保存实际数据,而VAO只是一个“包装器-对象”,保存指向我为它定义的所有缓冲区的指针? 更改VAOs成本很高(更改VBO也是如此?!)。目前,我加载网格,并将它们组合到模型中。每个模型都使

  • 我试图在OpenGL中使用多个VAO和VBO渲染多个对象。使用相同的顶点渲染多个对象我已经做过了,但是我想做的是为每个对象使用不同的顶点,例如画一个正方形和一个圆形。对于一个正方形,我只需要6个顶点,但是对于圆,我需要360个顶点。我有阅读或创建着色器的错误。 以下是顶点着色器: 片段着色器: VAO和VBO的生成与绑定 以及渲染循环中的绘制调用: 我重复一遍,用我做过的相同顶点绘制多个对象。我需

  • 我想渲染一个由许多立方体组成的大场景。我的第一个想法是创建一个立方体VBO,然后使用统一的模型矩阵多次绘制它来转换它。这很慢,因为我在每帧调用很多次。 所以我决定用一个巨大的VBO来代替每个立方体顶点和一个额外的平移向量。基本上,我使用我的旧通用多维数据集VBO加上转换向量,并将该列表附加到我想要绘制的每个多维数据集的VBO列表中。然后我绑定一个VAO并绘制它。我还更改了顶点着色器,使其接受该平移

  • 我目前一直在学习顶点数组和VBO的b/c,我目前了解到它比“立即”渲染更好/更快(比如使用glBegin),尽管这要容易得多。我做了一个小程序(实际上只是一个测试),它创建了一个按钮,当你将鼠标悬停在按钮上时,它会改变颜色,但是每当我启动它时,程序就会崩溃,并出现以下错误消息: }

  • 我一直在尝试将我的游戏原型渲染器从即时模式测试实现转换为实际的VAO/VBO实现。VBO正在屏幕上渲染,但拒绝纹理。下面是显示问题的最简单测试类: 纹理绑定调用如下所示(其中包装=GL_REPEAT和过滤器=GL_NEAREST): 花了一个周末的时间在谷歌上搜索,却没有找到答案,我是不是做错了什么?我还测试了使用即时模式,它仍然使用纹理进行渲染。

  • 经过大量的谷歌搜索,我在LWJGL渲染VBO立方体时遇到了这个问题。基本上,当我启用法线时,JVM会崩溃。这很可能与我在Plane.java中设置常态的方式有关。由于我仍在学习VBO,我似乎不知道如何解决这个问题。你能看一看,让我知道我可能在哪里出错了吗? Cube.java: 平面. java: 让我知道你们的想法。我已经在三台独立的计算机上测试了代码,每一台都有相同的结果。