Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LWJGL VBO JVM崩溃_Java_Opengl_Lwjgl - Fatal编程技术网

Java LWJGL VBO JVM崩溃

Java LWJGL VBO JVM崩溃,java,opengl,lwjgl,Java,Opengl,Lwjgl,在谷歌搜索了很多次之后,我在用LWJGL渲染VBO立方体时遇到了一个问题。基本上,当我启用normals时,JVM会崩溃。这很可能与我在Plane.java中设置法线的方式有关。由于我仍在学习VBO,我似乎不知道如何解决这个问题。你能看一下,让我知道我可能出了什么问题吗 Cube.java: package net.contour.src.voxel; import org.lwjgl.opengl.GL11; public class Cube { public float x;

在谷歌搜索了很多次之后,我在用LWJGL渲染VBO立方体时遇到了一个问题。基本上,当我启用normals时,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();
    }
}
Plane.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);
    }
}

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

我相信每个顶点都需要一条法线。(在上面的评论之后,我翻阅了类似的代码来验证这一点)。您只提供了一个法线坐标,代码预期为4(每个顶点一个)。

我注意到,整个四边形只有一个法线。我可能错了,但是每个顶点不应该有法线吗?glDrawArrays调用可能正在寻找更多法线,并在过程中遇到内存错误。我添加了4个法线坐标作为测试,但它仍然崩溃。这是我尝试过的:this.right=新平面(新浮点[]{size/2,size/2,-size/2,size/2,size/2,-size/2,size/2,size/2,-size/2,-size/2,-size/2},新浮点[]{1.0f,0.0f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f});您是否向normalData缓冲区添加了额外的9个浮点数(使用normalData.put方法)?你在这里提到的单一变化并没有添加额外的法线。是的,我添加了它们。很抱歉没提那件事。