【问题标题】:LWJGL 3.1.6 crashes on Win 10LWJGL 3.1.6 在 Win 10 上崩溃
【发布时间】:2018-07-30 16:26:06
【问题描述】:

即使这个问题被问了多次(我阅读了所有这些,但没有解决方案对我有用),我正在尝试使用 LWJGL 和 OpenGL 对矩形进行建模 ,但每次都会崩溃。这是我的 PC 统计数据:

AMD-锐龙 1600x | 微星英伟达 GTX 1060 (6GB) | 微星 x370 Carbon Pro 主板

我也在 Intel-Setup 上尝试了这个,带有 i7 处理器和 Nvidia Quadro K 1000M 设置,但您可以在以下看到相同的错误:

https://hastebin.com/ayiqiritov.makefile

我的绘画方法:

public void render(RawModel model){
    GL30.glBindVertexArray(model.getVaoID());
    GL20.glEnableVertexAttribArray(0);
    GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, model.getVertexCount());
    GL20.glDisableVertexAttribArray(0);
    GL30.glBindVertexArray(0);
}

在本课程中,我创建 VAO 和 VBO,并将数据存储到其中:

    private List<Integer> vaos = new ArrayList<Integer>();
private List<Integer> vbos = new ArrayList<Integer>();

public RawModel loadToVAO(float[] positions) {
    int vaoID = createVAO();
    storeDataInAttributeList(0, positions);
    unbindVAO();
    return new RawModel(vaoID, positions.length / 3);
}

public void cleanUp() {
    for (int vao : vaos) {
        GL30.glDeleteVertexArrays(vao);
    }
    for (int vbo : vbos) {
        GL15.glDeleteBuffers(vbo);
    }
}

private int createVAO() {
    int vaoID = GL30.glGenVertexArrays();
    vaos.add(vaoID);
    GL30.glBindVertexArray(vaoID);
    return vaoID;
}

private void storeDataInAttributeList(int attributeNumber, float[] data) {
    int vboID = GL15.glGenBuffers();
    vbos.add(vboID);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID);
    FloatBuffer buffer = storeDataInFloatBuffer(data);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
    GL20.glVertexAttribPointer(attributeNumber, 3, GL11.GL_FLOAT, false, 0, 0);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}

private void unbindVAO() {
    GL30.glBindVertexArray(0);
}

private FloatBuffer storeDataInFloatBuffer(float[] data) {
    FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
    buffer.put(data).position(0);
    buffer.flip();
    return buffer;
}

还有我的主要方法:

        public static void main(String[] args){
    if(!glfwInit()){
        throw new IllegalStateException("Failed");
    }

    System.out.println(GL11.glGetString(GL11.GL_VERSION));

    glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);

    GLFW.glfwWindowHint(GLFW.GLFW_CONTEXT_VERSION_MINOR, 3);
    GLFW.glfwWindowHint(GLFW.GLFW_CONTEXT_VERSION_MAJOR, 4);

    long window = GLFW.glfwCreateWindow(640, 480, "Hello World", 0, 0);

    if(window == 0){
        throw new IllegalStateException("Failed to create Window");
    }

    GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
    glfwSetWindowPos(window, (vidmode.width() - 640) / 2, (vidmode.height() - 480) / 2);

    glfwShowWindow(window);

    Loader loader = new Loader();
    Renderer renderer = new Renderer();

    float[] vertices = {
        -0.5f, 0.5f, 0f,
        -0.5f, -0.5f, 0f,
        0.5f, -0.5f, 0f,

        0.5f, -0.5f, 0f,
        0.5f, 0.5f, 0f,
        -0.5f, 0.5f, 0f
    };

    RawModel model = loader.loadToVAO(vertices);

    while(!glfwWindowShouldClose(window)){
        renderer.prepare();
        renderer.render(model);
        glfwPollEvents();
    }

    loader.cleanUp();
    GLFW.glfwTerminate();

}

所以我已经试过了:

更新显卡驱动,更新java,更新Windows,设置新的eclipse,重新安装java,删除eclipse中的.metadata。

谁能帮帮我?

【问题讨论】:

  • 着色器程序在哪里?
  • 我还没有实现着色器...或者你是什么意思?
  • 似乎与this 重复。从 Rabbid76 答案(设置 OGL >=3.0)开始,然后继续您将遇到的下一个错误。
  • 好的,现在我有一个红色的屏幕,但没有任何渲染:(

标签: java opengl lwjgl vbo vao


【解决方案1】:

根据评论

我还没有实现着色器

OpenGL 中最先进的渲染方式是使用Shader

如果不使用着色器,则必须通过glVertexPointer 定义顶点数据数组。 glVertexPointer 为 Fixed-Function 顶点坐标属性指定一个数组。如果您没有着色器程序,则必须使用Fixed Function Pipeline

private void storeDataInAttributeList(int attributeNumber, float[] data) {
    int vboID = GL15.glGenBuffers();
    vbos.add(vboID);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID);
    FloatBuffer buffer = storeDataInFloatBuffer(data);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);

    GL11.glVertexPointer( 3, GL11.GL_FLOAT, 0, 0 ); // <---------

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}

您还必须通过glEnableClientState( GL_VERTEX_ARRAY ) 启用顶点坐标的客户端功能:

public void render(RawModel model){
    GL30.glBindVertexArray(model.getVaoID());

    GL11.glEnableClientState( GL11.GL_VERTEX_ARRAY );   // <---------

    GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, model.getVertexCount());

    GL11.glDisableClientState( GL11.GL_VERTEX_ARRAY );  // <---------

    GL30.glBindVertexArray(0);
}

进一步注意,在使用像 GL30.glGenVertexArrays() 这样的 OpenGL 指令之前,您必须创建“GLCapabilities”实例并使 OpenGL 绑定可用,并且您必须确保 OpenGL 上下文是最新的。

在创建窗口之后和任何 OpenGL 指令之前调用 glfwMakeContextCurrent(window)GL.createCapabilities()

long window = GLFW.glfwCreateWindow(640, 480, "Hello World", 0, 0);
if(window == 0){
    throw new IllegalStateException("Failed to create Window");
}

GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowPos(window, (vidmode.width() - 640) / 2, (vidmode.height() - 480) / 2);

glfwMakeContextCurrent(window);  // <-----

glfwShowWindow(window);

GL.createCapabilities();         // <-----

.....

最后你在渲染循环中缺少glfwSwapBuffersglfwSwapBuffers 交换指定窗口的前后缓冲区。换句话说,简单地说,它会将您渲染到的缓冲区合并到屏幕上:

while(!glfwWindowShouldClose(window)){
    renderer.prepare();
    renderer.render(model);

    glfwSwapBuffers(window); // <-----

    glfwPollEvents();
}

另见LWJGL 3 Guide - Getting Started

【讨论】:

  • 好的,现在我有一个红色的屏幕,但没有任何渲染:(
猜你喜欢
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
相关资源
最近更新 更多