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

LWJGL VBO JVM崩溃

齐冥夜
2023-03-14

经过大量的谷歌搜索,我在LWJGL渲染VBO立方体时遇到了这个问题。基本上,当我启用法线时,JVM会崩溃。这很可能与我在Plane.java中设置常态的方式有关。由于我仍在学习VBO,我似乎不知道如何解决这个问题。你能看一看,让我知道我可能在哪里出错了吗?

Cube.java:

package net.contour.src.voxel;

import org.lwjgl.opengl.GL11;

public class Cube {
    public float x;
    public float y;
    public float z;

    float size = 1.0f;

    private Plane top;
    private Plane bottom;
    private Plane left;
    private Plane right;
    private Plane front;
    private Plane back;

    public Cube(float x, float y, float z) {
        this.x = x;
        this.y = y;
        this.z = z;

        this.top = new Plane(new float[]{
            size / 2, size / 2, size / 2,
            -size / 2, size / 2, size / 2,
            -size / 2, size / 2, -size / 2,
            size / 2, size / 2, -size / 2
        }, new float[]{
            0.0f, 1.0f, 0.0f
        });

        this.bottom = new Plane(new float[]{
            size / 2, -size / 2, size / 2,
            -size / 2, -size / 2, size / 2,
            -size / 2, -size / 2, -size / 2,
            size / 2, -size / 2, -size / 2
        }, new float[]{
            0.0f, -1.0f, 0.0f
        });

        this.front = new Plane(new float[]{
            size / 2, size / 2, -size / 2,
            -size / 2, size / 2, -size / 2,
            -size / 2, -size / 2, -size / 2,
            size / 2, -size / 2, -size / 2
        }, new float[]{
            0.0f, 0.0f, 1.0f
        });

        this.back = new Plane(new float[]{
            size / 2, size / 2, size / 2,
            -size / 2, size / 2, size / 2,
            -size / 2, -size / 2, size / 2,
            size / 2, -size / 2, size / 2
        }, new float[]{
            0.0f, 0.0f, -1.0f
        });

        this.left = new Plane(new float[]{
            -size / 2, size / 2, size / 2,
            -size / 2, size / 2, -size / 2,
            -size / 2, -size / 2, -size / 2,
            -size / 2, -size / 2, size / 2
        }, new float[]{
            -1.0f, 0.0f, 0.0f
        });

        this.right = new Plane(new float[]{
            size / 2, size / 2, -size / 2,
            size / 2, size / 2, size / 2,
            size / 2, -size / 2, size / 2,
            size / 2, -size / 2, -size / 2
        }, new float[]{
            1.0f, 0.0f, 0.0f
        });
    }

    public void render() {
        GL11.glPushMatrix();
        GL11.glTranslatef(x, y, z);

        top.render();
        bottom.render();
        front.render();
        back.render();
        left.render();
        right.render();

        GL11.glPopMatrix();
    }

    public void destroy() {
        top.destroy();
        bottom.destroy();
        front.destroy();
        back.destroy();
        left.destroy();
        right.destroy();
    }
}

平面. java:

package net.contour.src.voxel;

import static org.lwjgl.opengl.GL11.GL_COLOR_ARRAY;
import static org.lwjgl.opengl.GL11.GL_FLOAT;
import static org.lwjgl.opengl.GL11.GL_NORMAL_ARRAY;
import static org.lwjgl.opengl.GL11.GL_QUADS;
import static org.lwjgl.opengl.GL11.GL_VERTEX_ARRAY;
import static org.lwjgl.opengl.GL11.glColorPointer;
import static org.lwjgl.opengl.GL11.glDisableClientState;
import static org.lwjgl.opengl.GL11.glDrawArrays;
import static org.lwjgl.opengl.GL11.glEnableClientState;
import static org.lwjgl.opengl.GL11.glNormalPointer;
import static org.lwjgl.opengl.GL11.glVertexPointer;
import static org.lwjgl.opengl.GL15.GL_ARRAY_BUFFER;
import static org.lwjgl.opengl.GL15.GL_STATIC_DRAW;
import static org.lwjgl.opengl.GL15.glBindBuffer;
import static org.lwjgl.opengl.GL15.glBufferData;
import static org.lwjgl.opengl.GL15.glDeleteBuffers;
import static org.lwjgl.opengl.GL15.glGenBuffers;

import java.nio.FloatBuffer;

import org.lwjgl.BufferUtils;

public class Plane {
    float size = 0.5f;

    private final int amountOfVertices = 4;
    private final int vertexSize = 3;
    private final int colorSize = 3;
    private final int normalSize = 3;

    private FloatBuffer vertexData;
    private FloatBuffer colorData;
    private FloatBuffer normalData;

    private int vboVertexHandle;
    private int vboColorHandle;
    private int vboNormalHandle;

    public Plane(float[] v, float[] n) {
        vertexData = BufferUtils.createFloatBuffer(amountOfVertices * vertexSize);
        vertexData.put(new float[] {
            v[0], v[1], v[2],
            v[3], v[4], v[5],
            v[6], v[7], v[8],
            v[9], v[10], v[11]
        });
        vertexData.flip();

        colorData = BufferUtils.createFloatBuffer(amountOfVertices * colorSize);
        colorData.put(new float[] {
            1, 0, 0,
            1, 0, 0,
            1, 0, 0,
            1, 0, 0
        });
        colorData.flip();

        normalData = BufferUtils.createFloatBuffer(normalSize);
        normalData.put(new float[] {
                n[0], n[1], n[2]
        });
        normalData.flip();

        vboVertexHandle = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
        glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        vboColorHandle = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, vboColorHandle);
        glBufferData(GL_ARRAY_BUFFER, colorData, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        vboNormalHandle = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, vboNormalHandle);
        glBufferData(GL_ARRAY_BUFFER, normalData, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
    }

    public void render() {
        glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
        glVertexPointer(vertexSize, GL_FLOAT, 0, 0L);

        glBindBuffer(GL_ARRAY_BUFFER, vboColorHandle);
        glColorPointer(colorSize, GL_FLOAT, 0, 0L);

        glBindBuffer(GL_ARRAY_BUFFER, vboNormalHandle);
        glNormalPointer(normalSize, GL_FLOAT, 0L);

        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
        glEnableClientState(GL_NORMAL_ARRAY);
        glDrawArrays(GL_QUADS, 0, amountOfVertices);
        glDisableClientState(GL_NORMAL_ARRAY);
        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);
    }

    public void destroy() {
        glDeleteBuffers(vboVertexHandle);
        glDeleteBuffers(vboColorHandle);
    }
}

让我知道你们的想法。我已经在三台独立的计算机上测试了代码,每一台都有相同的结果。

共有1个答案

方建明
2023-03-14

我相信你确实需要为每个顶点设置一个正态。(在上面评论之后,我挖掘了类似的代码来验证这一点)。您只提供一个法向坐标,并且代码需要 4(每个顶点一个)。

 类似资料:
  • 我试图在solaris机箱中使用远程Weblogic服务器配置jProfiler。服务器正常启动,但是当我将jProfiler GUI连接到服务器时,出现以下错误,服务器崩溃。tmp目录具有足够的访问权限和空间。我可以看到一些文件,比如jpcOYaysx,是在tmp目录中创建的。有人能帮我解决这个问题吗?我们是否有特定于jProfiler的日志,如何配置它? 我找不到任何帮助页面/文档编辑jPro

  • 问题内容: 在Swift,iOS 8,Xcode 6 Beta 6中,我从tableView中删除一行时遇到了一些麻烦。每次尝试删除一行时,都会出现以下错误: / [UITableView _endCellAnimationsWithContext:],/ SourceCache / UIKit_Sim / UIKit-3302.3.1 / UITableView.m:1581 2014-08-3

  • 问题内容: 今天在工作中,我的日食开始反复崩溃。只需打开它并开始编辑文件,几分钟后即可崩溃。我重新安装了所有内容:Eclipse,Workspace,Java,但没有任何帮助。由于我目前无法工作,请尝试确定问题的根源。 (…) 问题答案: 这是C2编译器中的一个已知JVM错误:JDK-8154831。 尝试添加以下JVM参数:

  • 仅供参考;这不需要回答。 我在一个负载很重的Postgres服务器上工作,发出了一个挂起的GRANT命令。它没有被任何其他命令阻止。我有几个打开的连接,并且能够用一个普通的pg_cancel_backend(SIGTERM)命令杀死几个进程,但我的GRANT命令没有响应该命令或pg_ terminate_backde(SIGINT)。我最后尝试了“kill-9(pid)”(SIGKILL),服务器

  • Project My Application11在运行Gradle时使用以下JDK位置:C:/Program Files/Android/Android Studio1/jre在不同进程上使用不同的JDK位置可能会导致Gradle生成多个守护进程,例如,在使用Android Studio时从终端执行Gradle任务。更多信息。。。 显示此错误后自动关闭而不显示任何错误。 尝试了jdk 8和13,并

  • 崩溃(Crash),即闪退,多指在移动设备(如:iOS、Android设备)中,在打开应用程序时出现的突然退出中断的情况。 如果App应用的线上版本发生过多的崩溃,会影响用户体验,导致用户流失,以及可能减少收益。 诸葛io的「App崩溃分析」功能,可以帮助产品、运营人员对App应用发生崩溃的次数、影响的人数进行监测,也可以查看崩溃路径,还原崩溃场景,了解用户是如何一步一步发生的崩溃。同时,可以协助

  • 我正在使用内置于Web View的Android开发浏览器。其中我面临的一个问题是,当我访问http://crashmybrowser.com测试浏览器上的选项卡崩溃时,我的整个浏览器应用程序都会崩溃。但是,当在chrome或Opera上进行相同的测试时,这些浏览器会在崩溃中幸存下来,并且只有特定的选项卡崩溃是由于访问上述网站而预期的结果。有人能帮助理解我如何在使用Webview的浏览器上处理此崩

  • 问题内容: 我的JVM一直在libzip.so上持续崩溃,并且出乎意料。我已经将该错误提交给了Oracle,但决定看看这里是否有人遇到过该问题,如果是,您如何处理它?这是一个正在运行的网络应用 Linux 2.6.34-gentoo-r6#1 SMP Fri Sep 24 00:15:06 EDT 2010 i686 Intel(R)Xeon(R)CPU X5460 @ 3.16GHz 真正的带j