有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

GL30库中不存在intellij idea GLGEnVertexArray()。(JAVA LWJGL)

我试图按照thisOpenGL教程来渲染一个简单的三角形。在本教程开始时,在“VAO”部分下,我被告知要编写以下代码:

GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

我的C代码片段的Java代码是

int VertexArrayID;
glGenVertexArrays(1, VertexArrayID);
glBindVertexArray(VertexArrayID);

the documentation中,我已经导入了GL30类,其中包括方法glGenVertexArray()和glBindVertexArray()。然而IntelliJ没有将此视为有效的方法

我的进口:

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

import java.nio.*;

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

我的GLFW窗口提示:

glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // OpenGL 3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // For macOS
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

我在我的依赖项和pom中使用Maven。xml我正在使用来自LWJGL customizer的预设“一切”


共 (2) 个答案

  1. # 1 楼答案

    IDE没有“看到”glGenVertexArrays方法的原因是,您没有像对待GL11类那样,看到import static静态方法

    为了使类GL30的静态方法在类的范围内可解析,您还需要import static使用GL30的方法:

    import static org.lwjgl.opengl.GL30.*;

    此外,从版本3.2.0 of LWJGL 3开始,版本化的类,如GL11、GL12、GL13、GL20等从相应的先前版本继承

    因此,当您至少使用LWJGL 3.2.0时,就可以删除import static org.lwjgl.opengl.GL11.*;行和import static org.lwjgl.opengl.GL30.*;

    而且,由于您从GLFW请求OpenGL版本3.3,并且还使用了核心配置文件,因此您也可以使用import static org.lwjgl.opengl.GL33C.*;使OpenGL核心功能仅可见(而不是那些来自兼容性配置文件的功能-您没有请求,因此在运行时不可用)。这样,您就不会意外地使用不推荐使用的/兼容的函数

  2. # 2 楼答案

    请注意,在C代码段中,传递给glgenvertexarray的是指向int变量的指针——您传递的是应该用生成的ID值填充的内存地址

    在Java中,指向基元类型的指针的概念不同——在代码段中,传递的是整数,而不是指针。 您试图使用的API类没有glGenVertexArrays(int, int)方法,因此您的IDE正在抱怨

    而是使用glGenVertexArrays(int[])glGenVertexArrays(IntBuffer),例如:

    int[] vertexArrayIDs = new int[1]; // create an array where the generated ids will be stored
    glGenVertexArrays(vertexArrayIDs); // no need to say how many IDs we want - it's implicit in the array length
    glBindVertexArray(vertexArrayIDs[0]) // access the array to get the generated ID;