Java 为什么OpenGL(3)中的三角形不';是否使用lwjgl渲染?

Java 为什么OpenGL(3)中的三角形不';是否使用lwjgl渲染?,java,c++,opengl,glsl,lwjgl,Java,C++,Opengl,Glsl,Lwjgl,所以我最近开始学习lwjgl,并很快意识到我需要在OpenGL中进行改进才能继续。我遵循本教程,并尝试使用java和lwjgl实现相同的代码(本教程中的代码是用C++编写的)。我成功地使用LWJGLAPI复制了教程中的OpenGL调用,但当我启动程序时,我只看到黑屏,没有其他=(没有三角形,没有任何内容。控制台中没有错误) 我的Window.java类,在该类中我执行OpenGL渲染(不必考虑Spring注释,我只是使用IoC容器来管理对象,方法run()在Spring上下文创建后被调用): S

所以我最近开始学习lwjgl,并很快意识到我需要在OpenGL中进行改进才能继续。我遵循本教程,并尝试使用java和lwjgl实现相同的代码(本教程中的代码是用C++编写的)。我成功地使用LWJGLAPI复制了教程中的OpenGL调用,但当我启动程序时,我只看到黑屏,没有其他=(没有三角形,没有任何内容。控制台中没有错误)

我的Window.java类,在该类中我执行OpenGL渲染(不必考虑Spring注释,我只是使用IoC容器来管理对象,方法
run()
在Spring上下文创建后被调用):

Shaders.java类:

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

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

@Slf4j
@Service
public class Shaders {
    public int loadShaders(String vertexFilePath, String fragmentFilePath) throws IOException {
        int vertexShader = glCreateShader(GL_VERTEX_SHADER);
        int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

        String vertexCode = Files.lines(Paths.get(vertexFilePath))
                .collect(Collectors.joining("\n"));

        String fragmentCode = Files.lines(Paths.get(fragmentFilePath))
                .collect(Collectors.joining("\n"));

        compileShader(vertexShader, vertexCode);
        compileShader(fragmentShader, fragmentCode);

        int program = glCreateProgram();
        glAttachShader(program, vertexShader);
        glAttachShader(program, fragmentShader);
        glLinkProgram(program);

        glDetachShader(program, vertexShader);
        glDetachShader(program, fragmentShader);

        glDeleteShader(vertexShader);
        glDeleteShader(fragmentShader);

        return program;
    }

    private void compileShader(int shader, String code){
        glShaderSource(shader, code);
        glCompileShader(shader);
        String slog = glGetShaderInfoLog(shader);
        if (slog.contentEquals("")) return;
        log.info(slog);
    }
}
vertex.glsl文件:

#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
void main(){
  gl_Position.xyz = vertexPosition_modelspace;
  gl_Position.w = 1.0;
}
#version 330 core
out vec3 color;
void main(){
  color = vec3(1,0,0);
}
fragment.glsl文件:

#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
void main(){
  gl_Position.xyz = vertexPosition_modelspace;
  gl_Position.w = 1.0;
}
#version 330 core
out vec3 color;
void main(){
  color = vec3(1,0,0);
}
我遵循了本教程的第1部分(编码OpenGL调用)和第2部分(编码GLSL着色器,加载它们),但添加着色器并没有解决我的问题

我认为谷歌搜索不能给我更多的答案,因为几乎所有关于lwjgl主题的在线教程都使用OpenGL1进行渲染

我怎样才能做到这一点呢?

问题在于线路

glvertexattributepointer(0,3,GL_FLOAT,false,0,vertexBuffer);
如果绑定了命名缓冲区对象,则的最后一个参数将被视为缓冲区对象数据存储中的字节偏移量

使用
glvertexattributepointer
时,不必通过参数指定顶点缓冲区。该函数将顶点属性与缓冲区对象关联,该对象当前绑定到目标
GL\u数组\u缓冲区

它必须是:

glBindBuffer(GL_数组_BUFFER,vertexBuffer);
glvertexattributepointer(0,3,GL_FLOAT,false,0,0);
另见