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

LWJGL glDrawArray抛出无效操作

凌翔宇
2023-03-14

我刚刚开始学习现代OpenGL,我在渲染三角形时遇到了麻烦。当我启动程序时,当我尝试调用glDrawArray时,它会给出一个无效操作异常。从控制台日志的外观来看,着色器的设置没有错误,程序也经过了验证。很多代码都是从本教程中复制的。我已经搜索了几个小时,无法找出导致问题的原因。如果我错过了一些基本的东西,我真的很抱歉。

java程序:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.FloatBuffer;

import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.ContextAttribs;
import org.lwjgl.opengl.Display;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL30.*;
import org.lwjgl.opengl.PixelFormat;

public class MAIN {

    public static void main(String[] args) {
        try {
            try {
                ContextAttribs attr = new ContextAttribs(3, 2)
                        .withForwardCompatible(true).withProfileCore(true);
                Display.create(new PixelFormat(), attr);
            } catch (Exception ex) {
                ex.printStackTrace();
                return;
            }

            int vert = loadShader(ClassLoader.getSystemResource("shader.vert"),
                    GL_VERTEX_SHADER);
            int frag = loadShader(ClassLoader.getSystemResource("shader.frag"),
                    GL_FRAGMENT_SHADER);
            if (frag == -1 || vert == -1) {
                Display.destroy();
                System.exit(2);
            }
            int prog = glCreateProgram();
            glAttachShader(prog, vert);
            glAttachShader(prog, frag);
            glLinkProgram(prog);
            if (glGetProgrami(prog, GL_LINK_STATUS) == GL_FALSE) {
                int length = glGetProgrami(prog, GL_INFO_LOG_LENGTH);
                System.out.println(glGetProgramInfoLog(prog, length));
                System.out.println("Linking failed");
                Display.destroy();
                System.exit(2);
            }
            System.out.println("Shader setup sucesfull");
            glViewport(0, 0, Display.getWidth(), Display.getHeight());

            glUseProgram(prog);

            int buff = glGenVertexArrays();
            glBindVertexArray(buff);

            glValidateProgram(prog);
            System.out.println(glGetProgrami(prog, GL_VALIDATE_STATUS) == GL_TRUE);

            FloatBuffer buf = BufferUtils.createFloatBuffer(12);
            buf.put(new float[] { -50, 50, 0, 1, 50, -50, 0, 1, 0, -50, 0, 1 });
            buf.flip();
            buff = glGenBuffers();
            glBindBuffer(GL_ARRAY_BUFFER, buff);
            glBufferData(GL_ARRAY_BUFFER, buf, GL_STATIC_DRAW);
            glBindBuffer(GL_ARRAY_BUFFER, 0);

            while (!Display.isCloseRequested()
                    && !Thread.currentThread().isInterrupted()) {

                glClear(GL_COLOR_BUFFER_BIT);

                glBindBuffer(GL_ARRAY_BUFFER, buff);
                glEnableVertexAttribArray(1);
                glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);
                glDrawArrays(GL_TRIANGLES, 0, 3); // The Error
                glBindBuffer(GL_ARRAY_BUFFER, 0);

                Display.update();
                Display.sync(60);
            }
            Display.destroy();
        } catch (Exception ex) {
            ex.printStackTrace();
            if (Display.isCreated()) {
                Display.destroy();
            }
        }
    }

    public static int loadShader(URL path, int shaderType) {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(
                path.openStream()))) {
            String text = "";
            String line;
            while ((line = in.readLine()) != null) {
                text = text + "\n" + line;
            }
            text.replaceFirst("\n", "");

            int shader = glCreateShader(shaderType);
            System.out.println("Setup shader: " + path + " for id: " + shader);
            glShaderSource(shader, text);

            glCompileShader(shader);
            if (glGetShaderi(shader, GL_COMPILE_STATUS) == GL_FALSE) {
                int length = glGetShaderi(shader, GL_INFO_LOG_LENGTH);
                String log = glGetShaderInfoLog(shader, length);
                System.out.println("Shader " + shader + " log: " + log);
                return -1;
            }
            return shader;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return -1;
    }
}

顶点着色器:

#version 330

layout(location = 0) in vec4 position;
void main() {
    gl_Position = position;
}

和片段着色器:

#version 330

out vec4 outputColor;
void main() {
    outputColor = vec4(1, 1, 1, 1);
}

共有1个答案

督劲
2023-03-14

您启用了错误的顶点属性:

glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);

glEnableVertexAttribArray()的第一个参数是要启用的顶点属性的位置。它对应于glVertexAttribPointer()的第一个参数,以及您在着色器代码中为该属性指定的位置:

layout(location = 0) in vec4 position;

由于您使用0作为位置的位置,因此glEnableVertexAttribArray()的参数也应该为0:

glEnableVertexAttribArray(0);
 类似资料:
  • 以下是我的OS和Java版本: OS:Windows 10 openjdk版本“1.8.0_242” openjdk运行时环境(构建1.8.0_242-B08) openjdk 64位服务器VM(构建25.242-B08,混合模式)

  • 我有以下代码: 出于某种原因,代码有时工作正常,有时则不正常,调试后我注意到当它不工作时,Datareader在其“HasRow”方法上有一个异常,特别是无效数字异常。我尝试直接在DBMS上运行结果查询,它执行得很好,有人知道为什么会发生这种异常吗?我错过了什么?。

  • 我使用的是4.5.2.NET框架。有什么想法吗?

  • 问题内容: 我正在为我的应用程序使用Hibernate 3.2.5。 我有一张桌子和一张桌子。 部门java 员工.java HBM映射文件 以下是本机SQL的代码: 我得到了例外: 当我直接在数据库中运行查询时,我会得到正确的输出,但是在hibernate状态下,它给出的是。我已经确认列名仅是正确的。 请让我知道如何解决此问题。 问题答案: 您的映射中包含以下内容: 但是您的sql 和之间没有这

  • 我用java编写了一个简单的程序,它创建到Oracle数据库的连接并执行更新查询。 查询成功执行,但如果更新查询包含以“F”开头的列,则抛出异常 “java.sql.SQLSyntaxErrorException:ORA-00904:“F”:无效标识符”。 如果我删除以“F”开头的列,那么< code > prepare statement . getparametermetadata()将正确执

  • 我正在尝试为我的登录构建一个提交表单,但我不知道为什么这个操作不起作用。有什么想法吗? > 列表项jquery $(“Form”).Submit(函数(e){e.PreventDefault();switch(this.id){case“login-form”:var$lg_username=$('#login_username').val();var$lg_password=$('#login_