【问题标题】:JOGAMP simple triangle isn't getting displayed on screenJOGAMP 简单三角形未显示在屏幕上
【发布时间】:2021-04-25 08:06:06
【问题描述】:

我正在尝试让一个三角形显示在窗口中。我让窗口出现,但窗口是黑色的,窗口中没有出现三角形。着色器文件可以打开(如果不能打开,我会得到 FileNotFoundException),但是三角形不会显示在屏幕上。这是我的代码:

public class GoodbyeSimpleWorld implements GLEventListener, KeyListener {

    private static GLWindow window;
    private static Animator animator;

    float vertices[] = {
            -0.5f, -0.5f, 0.0f,
            0.5f, -0.5f, 0.0f,
            0.0f,  0.5f, 0.0f
    };

    int shaderProgram;
    IntBuffer VAO;
    IntBuffer VBO;
    int iVBO, iVAO;

    public static void main(String[] args) {
        new GoodbyeSimpleWorld().setup();
    }

    private void setup() {

        GLProfile glProfile = GLProfile.get(GLProfile.GL3);
        GLCapabilities glCapabilities = new GLCapabilities(glProfile);

        window = GLWindow.create(glCapabilities);

        window.setTitle("Goodbye Simple World");
        window.setSize(1024, 768);

        window.addGLEventListener(this);
        window.addKeyListener(this);

        window.setVisible(true);

        window.addGLEventListener(this);
        window.addKeyListener(this);

        window.addWindowListener(new WindowAdapter(){
            @Override
            public void windowDestroyed(WindowEvent e) {
                animator.stop();
                System.exit(0);
            }
        });

        animator = new Animator();
        animator.start();

    }


    @Override
    public void init(GLAutoDrawable drawable) {
        GL3 gl = drawable.getGL().getGL3();

        ShaderCode vertexShader = ShaderCode.create(gl, GL_VERTEX_SHADER, this.getClass(),
                "shaders/gl3", null, "goodbye", "vert", null, true);
        vertexShader.compile(gl);

        ShaderCode fragmentShader = ShaderCode.create(gl, GL_FRAGMENT_SHADER, this.getClass(),
                "shaders/gl3", null, "goodbye", "frag", null, true);
        fragmentShader.compile(gl);

        shaderProgram = gl.glCreateProgram();
        gl.glAttachShader(shaderProgram, vertexShader.id());
        gl.glAttachShader(shaderProgram, fragmentShader.id());
        gl.glLinkProgram(shaderProgram);
        gl.glDeleteShader(vertexShader.id());
        gl.glDeleteShader(fragmentShader.id());
        VBO = GLBuffers.newDirectIntBuffer(1);
        VAO = GLBuffers.newDirectIntBuffer(1);

        gl.glGenVertexArrays(1, VAO);
        gl.glGenBuffers(1, VBO);

        iVBO = VBO.get();
        iVAO = VAO.get();

        gl.glBindVertexArray(iVAO);

        gl.glBindBuffer(GL.GL_ARRAY_BUFFER, iVBO);
        gl.glBufferData(GL.GL_ARRAY_BUFFER, vertices.length, FloatBuffer.wrap(vertices), gl.GL_STATIC_DRAW);

        gl.glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, 3 * Float.BYTES, 0);
        gl.glEnableVertexAttribArray(0);

        gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);

        gl.glBindVertexArray(0);
    }

    @Override
    public void display(GLAutoDrawable drawable) {
        GL3 gl = drawable.getGL().getGL3();
        drawable.setAutoSwapBufferMode(true);
        gl.glUseProgram(shaderProgram);
        gl.glBindVertexArray(iVAO);
        gl.glDrawArrays(GL_TRIANGLES, 0, 3);
        gl.glBindVertexArray(iVAO);
    }
...
}

【问题讨论】:

    标签: java opengl jogl


    【解决方案1】:

    我发现了几个问题:

    • VBO 是一个包含 VBO 的 name 的缓冲区,但是您将它传递给 glBufferData 您希望存储在 VBO 中的 data 的地方,您永远不会将vertices 数组复制到缓冲区中
    • 你用Long.MIN_VALUE调用glVertexAttribPointer,大约是-2^63,但你应该放在那里的值是0
    • 在进行实际绘图调用时,您没有绑定 VAO
    • 您永远不会在任何地方拨打SwapBuffers。请注意,可以将 GLEventListener 设置为setAutoSwapBufferMode 模式来为您执行此操作,但这只会影响dispay 方法,在init 中调用您的绘图调用没有多大意义。

    【讨论】:

    • 我进行了您向我建议的大部分更改,我相信我可能遗漏了一些东西,因为我仍然难以显示三角形。
    • 你仍然没有绑定到绘图调用的 VAO
    • 如何添加绑定到绘图调用的 VAO?
    • glBindVertexArray()。但是你真的应该首先了解 OpenGL 的基本工作原理,stackoverflow 不是一个教程网站,但确实有很多好的 GL 教程。
    • 我正在尝试学习本教程:learnopengl.com/Getting-started/Hello-Triangle。我正在从这里提取源代码:learnopengl.com/code_viewer_gh.php?code=src/1.getting_started/… 并尝试将其转换为 Java。
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多