java - 尝试使用 LWJGL 运行简单的 GLSL 着色器程序,但此代码不起作用

标签 java opengl glsl lwjgl

我正在尝试使用 LWJGL 运行这个简单的 GLSL 着色器代码,但显示仍然是黑色的。 (toFloatBuffer(float[] array) 方法在类中指定并且有效)。

try {
        Display.create();
        Display.setDisplayMode(new DisplayMode(800, 600));
    } catch (LWJGLException e) {
        e.printStackTrace();
    }

    GL11.glViewport(0, 0, Display.getWidth(), Display.getHeight());


    //Using buffers
    //bufferStuff();
    //shaderStuff();
    System.out.println(GL11.glGetString(GL11.GL_VERSION) + "\n");

    String vertexShaderSource = 
        "#version 400 core                           \n" +
        "                                            \n" +
        "void main()                                 \n" +
        "{                                           \n" +
        "    gl_Position = vec4(0.0, 0.0, 0.0, 0.0); \n" +
        "}                                           \n";

    String fragmentShaderSource =
        "#version 400 core                            \n" +
        "                                             \n" +
        "out vec4 color;                              \n" +
        "                                             \n" +
        "void main()                                  \n" +
        "{                                            \n" +
        "    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); \n" +
        "}                                            \n";

    int vertexShader = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);
    GL20.glShaderSource(vertexShader, vertexShaderSource);
    GL20.glCompileShader(vertexShader);
    System.out.println(GL20.glGetShaderInfoLog(vertexShader, GL20.glGetShaderi(vertexShader, GL20.GL_INFO_LOG_LENGTH)));

    int fragmentShader = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);
    GL20.glShaderSource(fragmentShader, fragmentShaderSource);
    GL20.glCompileShader(fragmentShader);
    System.out.println(GL20.glGetShaderInfoLog(fragmentShader, GL20.glGetShaderi(fragmentShader, GL20.GL_INFO_LOG_LENGTH)));

    int program = GL20.glCreateProgram();
    GL20.glAttachShader(program, vertexShader);
    GL20.glAttachShader(program, fragmentShader);
    GL20.glLinkProgram(program);
    System.out.println(GL20.glGetProgramInfoLog(program, GL20.glGetProgrami(program, GL20.GL_INFO_LOG_LENGTH)));

    GL20.glDeleteShader(vertexShader);
    GL20.glDeleteShader(fragmentShader);

    int VAO = GL30.glGenVertexArrays();
    GL30.glBindVertexArray(VAO);
    GL11.glPointSize(4);

    while(!Display.isCloseRequested())
    {
        GL30.glClearBuffer(GL11.GL_COLOR, 0, toFloatBuffer(new float[]{0, 0, 0, 1}));

        GL20.glUseProgram(program);

        GL11.glDrawArrays(GL11.GL_POINTS, 0, 3);

        Display.sync(60);
        Display.update();
    }

程序的输出是这样的

4.2.11733 Compatibility Profile Context

Vertex shader was successfully compiled to run on hardware.

Fragment shader was successfully compiled to run on hardware.

Vertex shader(s) linked, fragment shader(s) linked.

着色器似乎已正确编译和链接,并受我的 OpenGL 版本支持。 知道为什么我会出现黑屏吗?

最佳答案

在顶点着色器中,输出始终 vec4(0, 0, 0, 0)它总是位于剪辑空间之外。因为在顶点着色器之后,GPU 会将所有组件除以第 4 个组件,如果第 4 个组件为 0,则默认情况下该点位于剪辑空间之外。

由于这是顶点着色器唯一可能的输出,因此着色器永远不会在屏幕上绘制任何内容。如果将其替换为 vec4(0.0, 0.0, 0.0, 1.0)然后你会在屏幕中央看到一个红点。

关于java - 尝试使用 LWJGL 运行简单的 GLSL 着色器程序,但此代码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27419491/

相关文章:

python - 具有多个基元的显示列表的 VBO 等价物?

java - LWJGL代码产生黑屏

java.util.regex.PatternSyntaxException : null (in java. util.regex.Pattern)错误

opengl - OpenGL 中内存管理的困惑

java - 如何使用Java通过Selenium WebDriver获取<ul>的所有<li>?

linux - debian 下的 OpenGL 编译 - glGetUniformLocation 未声明

OpenGL 闪烁的像素伪像

c++ - 了解 GL_SHADER_STORAGE_BLOCK 绑定(bind)

java - 在 Java 中比较 XML

java - 从 URI 获取 anchor