使用 VAO 和 VBO 在 LWJGL 3 中渲染四边形时出现问题

2023-12-06

(这是我第二次问这个问题。上次我得到一个没有解决这个问题的答案(那里的答案提到了我尝试修复这个问题时意外留下的一些代码)。我也改变了问题本身略有不同 - 我改变了代码的顺序,将我认为错误较高的部分放在其中,并补充说我正在使用 macOS,这可能是它不起作用的原因)。

所以,我刚刚开始学习 LWJGL 3,我混合使用了几个教程和示例代码来制作一些应该使用 VAO 和 VBO 将矩形渲染到洋红色屏幕的东西。没有错误,但矩形没有出现在屏幕上(我只能看到洋红色屏幕)。我尝试使用旧的 LWJGL 管道(glBegin() and glEnd())并且它确实有效,所以我尝试更改渲染代码中的随机内容以及对 VAO 和 VBO 的加载。我也尝试绑定VBO,但它没有改变任何东西。我也尝试过调试,似乎创建了一个 VAO 和一个 VBO。

有人可以看一下我的代码并看看是否有问题吗?这是(抱歉,如果它有点混乱。就像我说的,我不认为问题出在 Main 或 Window 类中,但我不知道 LWJGL 所以我想把它放在这里。如果你有时间,请也看看它们。否则,如果您能看看 Loader 和 Renderer 类,我将非常感激):

(顺便说一句,我使用的是 macOS,并且我确实打开了 -XstartOnFirstThread)。

原始模型类:

package engine.io;
 
public class RawModel {
    private int vaoID;
    private int vertexCount;
     
    public RawModel(int vaoID, int vertexCount) {
        this.vaoID = vaoID;
        this.vertexCount = vertexCount;
    }
 
    public int getVaoID() {
        return vaoID;
    }
 
    public int getVertexCount() {
        return vertexCount;
    }
}

加载器类:

package engine.io;
 
import java.nio.FloatBuffer;
import java.util.ArrayList;
import java.util.List;

import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;
import org.lwjgl.system.MemoryUtil;

public class Loader {
        
    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);
    }
     
    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 = MemoryUtil.memAllocFloat(data.length);
        buffer.put(data);
        buffer.flip();
        return buffer;
    }
     
    public void cleanUp() {
        for (int vao : vaos) {
            GL30.glDeleteVertexArrays(vao);
        }
        for (int vbo : vbos) {
            GL15.glDeleteBuffers(vbo);
        }
    }
}

渲染器类:

package engine.io;
    
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;

public class Renderer {

    public void prepare() {
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
        GL11.glClearColor(1f, 0f, 1f, 1f);
    }
     
    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);
    }
}

这是主类:

import org.lwjgl.*;
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import org.lwjgl.system.*;

import engine.io.Loader;
import engine.io.RawModel;
import engine.io.Renderer;
import engine.io.Window;

import java.nio.*;

import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryStack.*;
import static org.lwjgl.system.MemoryUtil.*;

public class Main {
 
    private Window window;
     
    Loader loader = new Loader();
    Renderer renderer = new Renderer();
     
    float[] vertices = {
            // Left bottom triangle
            -0.5f, 0.5f, 0f,
            -0.5f, -0.5f, 0f,
            0.5f, -0.5f, 0f,
            // Right top triangle
            0.5f, -0.5f, 0f,
            0.5f, 0.5f, 0f,
            -0.5f, 0.5f, 0f
    };
     
    RawModel model;
     
    public void run() {
        setup();
        loop();
         
        loader.cleanUp();
 
        glfwFreeCallbacks(window.getWindowNum());
        glfwDestroyWindow(window.getWindowNum());
         
        glfwTerminate();
        glfwSetErrorCallback(null).free();
    }
 
    private void loop() {
        while ( !glfwWindowShouldClose(window.getWindowNum()) ) {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
             
            renderer.render(model);
             
            glfwSwapBuffers(window.getWindowNum()); // swap the color buffers
             
            glfwPollEvents();
        }
    }
 
    public void setup() {
        window = new Window(900, 300, "Flappy Bird");
        window.create();
         
        GL.createCapabilities();
        GLFW.glfwMakeContextCurrent(window.getWindowNum());
 
        model = loader.loadToVAO(vertices);
        renderer.prepare();
         
        GL11.glViewport(0, 0, 900, 300);
        
    }
     
    public static void main(String[] args) {
        new Main().run();
    }
}

这是窗口类:

package engine.io;
 
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryStack.stackPush;
import static org.lwjgl.system.MemoryUtil.*;

import java.nio.IntBuffer;

//import static org.lwjgl.glfw.GLFW.*;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.glfw.GLFWVidMode;
import org.lwjgl.system.MemoryStack;

public class Window {
    private int width, height;
    private String title;
    private long window;
 
    public Window(int width, int height, String title) {
        this.width = width;
        this.height = height;
        this.title = title;
    }
 
    public void create() {
        GLFWErrorCallback.createPrint(System.err).set();
 
        if (!glfwInit())
            throw new IllegalStateException("Unable to initialize GLFW");
 
        // Configure GLFW
        glfwDefaultWindowHints(); // optional, the current window hints are already the default
        glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // the window will stay hidden after creation
        glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // the window will be resizable
 
        // Create the window
        window = glfwCreateWindow(width, height, "Flappy Bird", NULL, NULL);
        if (window == NULL)
            throw new RuntimeException("Failed to create the GLFW window");
 
        // Get the thread stack and push a new frame
        try (MemoryStack stack = stackPush()) {
            IntBuffer pWidth = stack.mallocInt(1); // int*
            IntBuffer pHeight = stack.mallocInt(1); // int*
 
            // Get the window size passed to glfwCreateWindow
            glfwGetWindowSize(window, pWidth, pHeight);
 
            // Get the resolution of the primary monitor
            GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
 
            // Center the window
            glfwSetWindowPos(window, (vidmode.width() - pWidth.get(0)) / 2, (vidmode.height() - pHeight.get(0)) / 2);
        } // the stack frame is popped automatically
            // Setup a key callback. It will be called every time a key is pressed, repeated
            // or released.
        glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> {
            if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE)
                glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop
        });
 
        // Make the OpenGL context current
        glfwMakeContextCurrent(window);
        // Enable v-sync
        glfwSwapInterval(1);
 
        // Make the window visible
        glfwShowWindow(window);
 
    }
         
    public long getWindowNum() {
        return window;
    }
}

由于您使用的是 MacOS,我建议设置 3.2 核心配置文件OpenGL上下文. See OS X 上的 OpenGL 开发:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, true);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

// Create the window
window = glfwCreateWindow(width, height, "Flappy Bird", NULL, NULL);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 VAO 和 VBO 在 LWJGL 3 中渲染四边形时出现问题 的相关文章

  • 如何用Java写入OS系统日志?

    Mac OS 有一个名为 Console 的应用程序 其中包含记录的消息 错误和故障 我相信 Windows 中的等效项是事件查看器 我想 Linux 上也有一个 但我不知道它是什么 也不知道它在哪里 是否可以像这样从 Java 输出获取消
  • Java Sqlite Gradle

    我对 gradle 和 java 还很陌生 我有一个使用 sqlite 的项目 它通过 intellij idea 运行良好 但我无法从终端运行它 它会抛出异常 java lang ClassNotFoundException org sq
  • 如何防止在 CXF Web 服务客户端中生成 JAXBElement

    我正在尝试使用 CXF 创建一个 Web 服务客户端来使用 WCF Web 服务 当我使用 wsdl2java 时 它生成具有 JAXBElement 类型而不是 String 的对象 我读到有关使用 jaxb bindings xml 文
  • Java中定义类型后同时初始化多个变量?

    这里需要一些语法方面的帮助 我正在尝试在定义类型后重新初始化多个变量 例如 int bonus sales x y 50 这工作正常 但是我想稍后在程序中将不同的值放入其中一些变量中 但我收到语法错误 bonus 25 x 38 sales
  • Maven 目标的默认阶段?

    据我了解 在 Maven 中 插件目标可以附加到生命周期阶段 如果没有定义 默认阶段是什么 根据我的经验 这取决于插件的目标 例如 组装 单个 http maven apache org plugins maven assembly plu
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • JavaFx 中装饰且不可移动的舞台

    我想在 JavaFx 中创建一个装饰舞台 它也将不可移动 我正在从另一个控制器类创建这个阶段 我能够创造和展示舞台 但它是自由移动的 我怎样才能创建这个 非常感谢帮助和建议 我把打开新关卡的方法贴出来 private void addRec
  • 如何在命令提示符中检查 JAVA_OPTS 值?

    我们的应用程序部署 JBoss 服务器然后抛出错误 PermGen space 然后在 jboss bat 和配置文件中设置 permgen 变量中的 java OPTS JAVA OPTs 中是否有值 assige 如何检查 如何在命令提
  • XSLT:我们可以使用abs值吗?

    我想知道在 XSLT 中我们是否可以使用 math abs 我在某处看到过这个 但它不起作用 我有类似的东西
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • 删除 ArrayList 对象问题

    我在处理作业时遇到从 ArrayList 中删除对象的问题 如果我使用 正常 for 循环 它的工作原理如下 public void returnBook String isbn for int i 0 i lt booksBorrowed
  • 膨胀类片段 InflateException 二进制 XML 文件时出错

    我正在使用 Material Design 和 NavigationDrawer 布局等设计我的第一个应用程序 但我遇到了一个问题 该应用程序非常简单 它只显示文本 并且基于 Android Studio 中提供的模板 尝试启动我的应用程序
  • Hibernate @OneToMany 注释到底是如何工作的?

    我对 Hibernate 还很陌生 我正在通过教程学习它 我在理解到底如何一对多注释作品 所以我有这两个实体类 Student代表一个学生并且Guide代表指导学生的人 因此 每个学生都与一名向导相关联 但一名向导可以跟随多个学生 我想要一
  • 在 netBeans 中运行程序时,字体看起来非常奇怪

    我在我的新 MacBook M1 上设置了 netBeans 和 SceneBuilder 除了运行程序时的字体外 一切正常 它看起来像这样 我不知道为什么 按钮应显示 Click me 标签应显示 Hello 我收到的错误消息是 M rz
  • setKeyListener 将覆盖 setInputType 并更改键盘

    大家好 我在两个设备之间遇到问题 在实践中使用InputType和KeyListener我正在操纵一个EditText让它从数字键盘接收逗号和数字 有关更多背景信息 请检查我之前的question https stackoverflow c
  • JPA - 非主键字段上的 @OneToOne 关系不起作用

    我有一个 Spring Data JPA 后端 使用 Hibernate 作为 ORM 实现 这是模型 Person MailConfig id PK uid PK FK Person uid uid Entity
  • Java中的媒体播放器库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在评估用于在 Java 中播放音频 视频的库 它不需要 100 Java Java 与本机库的绑定
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • Java:基于 Web 的应用程序中的单例类实例

    我在 Web Application 中有这个 Singleton 类 public class MyDAO private static MyDAO instance private MyDAO public static MyDAO g
  • 编译时在代码中替换Java静态最终值?

    在java中 假设我有以下内容 fileA java class A public static final int SIZE 100 然后在另一个文件中我使用这个值 fileB java import A class b Object t

随机推荐

  • 当查询大量数据时,第一次游标操作很慢。怎么解决?

    我必须查询三个表 并将数据显示到我的 customerView 中 我的代码是这样的 Log v TAG System CurrentTimeMillis int len cursor getCount Log v TAG System C
  • 基于选择框的动态部分 - Rails 2.3.5

    我已经编辑了我的请求 希望更清楚 我需要根据先前的选择框动态渲染部分 请求属于产品 产品所属类别 CATEGORY有很多产品 产品有很多要求 用户点击表单 create request html erb 用户选择一个类别 然后填充产品选择列
  • TextRenderer 不绘制长字符串

    看看这个样本 public partial class Form1 Form private static string myString null private const int MAX TEXT 5460 public Form1
  • JDBC 从 Access 表中选择最大值

    每当我运行以下代码时 即使该列存在于我的表中 我也会收到错误 未找到列 我正在使用access数据库 请寻求帮助 public class Trial1 public static void main String args try Cla
  • 动态改变 Objective C 中单元格的高度

    我创建了一个带有表格视图的应用程序 它在每个单元格中使用视图和标签 但是 如果我在 cell 代码中创建视图和单元格 它会返回空单元格 如果我删除 cell 条件 它会显示数据 但不采用动态高度 谁能帮帮我吗 void viewDidLoa
  • Spring 5.0.3 RequestRejectedException:请求被拒绝,因为 URL 未标准化

    不确定这是否是 Spring 5 0 3 的一个错误 或者是一个新功能来修复我的问题 升级后 我收到此错误 有趣的是 这个错误仅出现在我的本地计算机上 使用 HTTPS 协议的测试环境中的相同代码运行良好 继续 我收到此错误的原因是因为我用
  • 如何对 REST API 进行身份验证并映射到 Fabric 凭据

    如何使用用户名 密码创建一个新的用户帐户以针对composer rest server进行身份验证 我如何使用这个新创建的用户帐户针对composer rest server进行身份验证 我将如何管理该用户的会话 如何将此用户映射到网络参与
  • Eclipse 无法正确部署 Gradle 项目

    所以我有一个 gradle 项目 显然与 eclipse 完全集成有一些问题 当我使用 gradle build 命令构建整个内容并在 glassfish4 服务器上部署 EAR 文件时 一切似乎都工作得很好 但是当我尝试运行时 渐变日食
  • Laravel 获取属性数据

    我是 Laravel 新手 使用 Laravel 5 3 我正在创建一个check Laravel 模型中用于用户登录的函数 在这里我使用默认值从数据库获取所有数据 this gt all 这给我带来了一个大的多维 大批 Illuminat
  • Hibernate-无法延迟初始化角色集合:beans.Language.患者,无法初始化代理-无会话

    我使用 hibernate 创建一个 Rest api 我创建了一个方法来获取表中的所有项目 public List
  • 在 forEach 中进行异步调用

    我正在尝试迭代对象数组并使用 Node js 中的异步函数在这些对象中添加一些内容 到目前为止我的代码如下所示 var channel channels related channels channel forEach function e
  • firebase/firestore 文档查询不起作用 - javascript

    由于 firestore 是新的 我在使用它时遇到问题 我必须得到收藏 of all users并遍历它 但它不起作用 db collection users get then function querySnapshot console
  • Chrome 中 HTTP2 推送 XMLHttpRequest 缓存缺失

    我正在设置 Link 标头来预加载加载时发生的 XHR 请求 Link project icon png gt rel preload as image xhr stuff gt rel preload Chrome 57 0 预加载并使用
  • 使用选定区域的矩形框裁剪图像?

    我正在寻找一个好的教程或示例代码 它将展示如何裁剪从 iphone 相机拍摄的图像 某行的东西 但你可以用手指控制角落 任何提示都会得到极大的应用 因为我尝试了很多方法但没有得到结果 按钮操作的一些变化 IBAction cropImage
  • 循环从 2D 数组在 Javascript 中创建对象键和值

    这个问题在这里已经有答案了 我有两个数组 一个保存键 一个保存数组 每个数组都包含值 我想创建一个对象数组 其中每个对象将键和值配对 为此 我创建了一个数组 现在我尝试在将对象推入数组之前创建并填充对象 我的代码看起来与此类似 var ke
  • 动态创建组件总是删除最后一个实例

    我有一个child组件和parent成分 父组件动态渲染子组件 即按需渲染 并将记录保存在数组中 当子组件需要被删除时 它会发出事件 并因此传递其 id 以在记录中进行识别 尽管记录确实会根据 id 被删除 但最后创建的实例始终会被删除 即
  • 如何添加到 Eclipse 中的“错误日志”部分?

    我正在尝试制作一个 Eclipse 插件 让不懂英语的学生也能编写代码 因此 我想提取他 用他自己的语言 编码的错误 翻译它们并将它们放入错误日志中 供他查看和理解 如何在 错误日志 中写入 我不清楚这里的用例 但基于部分理解 您可以执行以
  • Python:返回主列表中每次出现子列表的所有索引[重复]

    这个问题在这里已经有答案了 我有一个主列表和一个子列表 我想找到在主列表中找到的每个子列表的索引 在本例中 我希望返回以下索引列表 gt gt gt main list 1 2 3 4 4 4 1 2 3 4 4 4 gt gt gt su
  • Facebook 应用程序:localhost 不再作为应用程序域

    我一直在使用 Rails 和 jQuery 为 Facebook 编写游戏 自从我开始使用 Facebook Javascript SDK 以来 使用 localhost 作为应用程序域似乎工作得很好 我能够在本地和 Heroku 上测试我
  • 使用 VAO 和 VBO 在 LWJGL 3 中渲染四边形时出现问题

    这是我第二次问这个问题 上次我得到一个没有解决这个问题的答案 那里的答案提到了我尝试修复这个问题时意外留下的一些代码 我也改变了问题本身略有不同 我改变了代码的顺序 将我认为错误较高的部分放在其中 并补充说我正在使用 macOS 这可能是它