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

使用VBO LWJGL渲染时出现致命错误

卢涵畅
2023-03-14

我是一个使用VBOs渲染数据的新手,当我试图绘制一个立方体时,我遇到了一个非常严重的错误。< br >

这使得程序崩溃。我注意到当我在代码中注释掉渲染方法时,错误消失了,但我似乎找不到错误的来源,因为我是VBO的新手。代码在下面,感谢任何帮助。

package engine;

import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glEnable;
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.glGenBuffers;

import java.nio.FloatBuffer;
import java.nio.IntBuffer;

import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;

public class Render{

    private int amountOfVerts = 4;
    private int vertexSize = 3;
    private int colorSize = 1;
    private FloatBuffer vertData, colorData;
    private int handle, colorHandle;

    public Render() {
        vertData = BufferUtils.createFloatBuffer(amountOfVerts * vertexSize);
        vertData.put(new float[]{0f,0f,0f, 100f,0f,0f, 100f,100f,0f, 0f,100f,0f});
        vertData.flip();

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

        handle = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, handle); //sets the current buffer to this
        glBufferData(GL_ARRAY_BUFFER, vertData, GL_STATIC_DRAW); // fills the new buffer / stores data
        glBindBuffer(GL_ARRAY_BUFFER, 0); // unbinds

        colorHandle = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, colorHandle); //sets the current buffer to this
        glBufferData(GL_ARRAY_BUFFER, colorData, GL_STATIC_DRAW); // fills the new buffer / stores data
        glBindBuffer(GL_ARRAY_BUFFER, 0); // unbinds
    }

    public void render(){
        glEnable(GL_DEPTH_TEST);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glBindBuffer(GL_ARRAY_BUFFER, handle);
        GL11.glVertexPointer(vertexSize, GL11.GL_FLOAT, 0, 0L);

        glBindBuffer(GL_ARRAY_BUFFER, colorHandle);
        GL11.glColorPointer(colorSize, GL11.GL_FLOAT, 0, 0L);

        GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
        GL11.glEnableClientState(GL11.GL_COLOR_ARRAY);
        GL11.glDrawArrays(GL11.GL_QUADS, 0, amountOfVerts);
        GL11.glDisableClientState(GL11.GL_COLOR_ARRAY);
        GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);

    }


}
package engine;

import static org.lwjgl.opengl.GL11.GL_MODELVIEW;
import static org.lwjgl.opengl.GL11.GL_PROJECTION;
import static org.lwjgl.opengl.GL11.glLoadIdentity;
import static org.lwjgl.opengl.GL11.glMatrixMode;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.util.glu.GLU;
import org.lwjgl.util.vector.Vector3f;

public class Screen {

    private Render r;
    private Camera c;
    private int w,h;

    public Screen() {
        init();
        r = new Render();
        c = new Camera(new Vector3f(0,0,0), 5f, 0.15f);
        gameLoop();

    }

    public static void main(String[] args) {
        Screen s = new Screen();
    }

    public void init(){
        try{
            Display.setDisplayModeAndFullscreen(Display.getDesktopDisplayMode());
            w = Display.getDesktopDisplayMode().getWidth();
            h = Display.getDesktopDisplayMode().getHeight();
            Display.setFullscreen(true);
            Display.create();
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            GLU.gluPerspective(30f, w / h, 0.003f, 1000f);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            Mouse.setGrabbed(true);

        }catch (LWJGLException e){
            e.printStackTrace();
        }
    }

    public void gameLoop(){
        while (!Display.isCloseRequested()){
            if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){
                System.exit(0);
                Display.destroy();
            }
            render();
            update();
            glLoadIdentity();
            c.lookThroughCamera();
            Display.update();
            Display.sync(60);
        }

        Display.destroy();

    }

    public void update(){
        c.update();
        c.mouseX = Mouse.getDX();
        c.mouseY = -Mouse.getDY();
        c.addYaw(c.mouseX * c.sensetivity);
        c.addPitch(c.mouseY * c.sensetivity);
    }

    public void render(){
        r.render();
    }
}

共有1个答案

孙渝
2023-03-14

来自glColorPointer的文档:

size: Specifies the number of components per color. Must be 3 or 4

将您的< code>colorSize更改为3,并将所需的浮点数添加到颜色缓冲区中,应该可以解决您的问题。

colorData.put(new float[]{0f,0f,0f, 1f,0f,0f, 1f,1f,0f, 0f,1f,0f});
 类似资料:
  • 我已经下载并安装了Codeception。我使用了以下说明:http://codeception.com/thanks 在编写和运行测试后,我得到以下错误: 我的单元测试如下: 当我的类没有扩展时,不会调用函数,断言函数也不会工作。 欢迎任何建议。

  • 当我试图创建一个新的空项目(或任何其他类型的项目)时,我在IntelliJ IDEA版本2017.3.5中得到错误int the title。到目前为止,我所做的是: > 从以下网址下载社区版本(不含jdk)https://www.jetbrains.com/idea/download/download-thanks.html?platform=linuxwithoutjdk&code=iic 将

  • 问题内容: 我对Python编码比较陌生,想了解Python中的统计信息和数据管理。为此,我想安装Matplotlib,这给了我一些问题。 我看到其他人有此问题,但是我还没有完全了解如何解决它。 要安装我使用 我安装了以下规格 Windows 10 Python 3.8 Microsoft Studio 2019 我遇到的第一个错误是安装Microsoft Studio,所以我做到了。我也尝试更新

  • 问题内容: 这是我的组件代码的片段: 但是,当我运行此代码时,在出现意外的令牌错误。为什么会发生这种情况,我该如何解决? 问题答案: 您必须将方法调用包装在JSX元素中,否则Babel不会将return语句识别为JSX或在这种情况下为内联JSX表达式。它不会将您的代码从JSX转换为纯JavaScript,因此会出现错误。实际上,它被解释为 对象文字 ,而不是您期望的内联JSX表达式: 解决方案是将

  • 我一直在遵循学说入门文档,并立即遇到了学说的CLI问题。 如果我试图逃跑 或者 或者甚至 PHP /vendor/bin/doctrine 我在我的终端中得到这个错误。。。 PHP致命错误:未捕获错误:在/Users/admin/.bitnami/stackman/machines/xampp/volumes/root/htdocs/doctrine2 tutorial/vendor/Doctri

  • > 我已经尝试了所有方法来添加这个远程存储库,但当我推送git-hub存储库时,我无法拉动或推送它可以工作,我缺少什么? e.gatoto@EMMANUELMINGW64~/Desktop/myrepo.git(master)$git推源主e.gatoto@192.168.180.27的密码:致命:~/Desktop/myrepo.git似乎不是git存储库致命:无法从远程存储库读取。 请确保您具