代码之家  ›  专栏  ›  技术社区  ›  mackycheese21

LWJGL VAO/VBO不显示

  •  2
  • mackycheese21  · 技术社区  · 6 年前

    这是我的代码:

    import org.lwjgl.*;
    import org.lwjgl.glfw.*;
    import org.lwjgl.opengl.*;
    import org.lwjgl.system.*;
    
    import java.io.File;
    import java.nio.*;
    import java.util.Scanner;
    
    import static org.lwjgl.glfw.Callbacks.*;
    import static org.lwjgl.glfw.GLFW.*;
    import static org.lwjgl.opengl.GL11.*;
    import static org.lwjgl.opengl.GL12.*;
    import static org.lwjgl.opengl.GL13.*;
    import static org.lwjgl.opengl.GL14.*;
    import static org.lwjgl.opengl.GL15.*;
    import static org.lwjgl.opengl.GL20.*;
    import static org.lwjgl.opengl.GL21.*;
    import static org.lwjgl.opengl.GL30.*;
    import static org.lwjgl.opengl.GL31.*;
    import static org.lwjgl.opengl.GL32.*;
    import static org.lwjgl.opengl.GL33.*;
    import static org.lwjgl.opengl.GL40.*;
    import static org.lwjgl.opengl.GL41.*;
    import static org.lwjgl.opengl.GL42.*;
    import static org.lwjgl.opengl.GL43.*;
    import static org.lwjgl.opengl.GL44.*;
    import static org.lwjgl.opengl.GL45.*;
    import static org.lwjgl.opengl.GL46.*;
    import static org.lwjgl.system.MemoryStack.*;
    import static org.lwjgl.system.MemoryUtil.*;
    
    public class Test {
    
      public static void main(String[] args) {
    
        if (!glfwInit()) {
          System.out.println("GLFW not init.");
          return;
        }
    
        glfwDefaultWindowHints();
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
        long window = glfwCreateWindow(500, 500, "Window", NULL, NULL);
        if (window == NULL) {
          System.out.println("Window not create.");
          return;
        }
    
        glfwMakeContextCurrent(window);
        glfwSwapInterval(1);
        glfwShowWindow(window);
    
        GL.createCapabilities();
    
        Utilities.printGLInfo();
    
        int vert=glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vert, Utilities.loadStrFromFile("Shaders/shader.vert"));
        glCompileShader(vert);
        if(glGetShaderi(vert, GL_COMPILE_STATUS)==GL_FALSE) {
          System.out.println("Vertex shader compilation error:\n"+glGetShaderInfoLog(vert));
        }
        int frag=glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(frag, Utilities.loadStrFromFile("Shaders/shader.frag"));
        glCompileShader(frag);
        if(glGetShaderi(frag, GL_COMPILE_STATUS)==GL_FALSE) {
          System.out.println("Fragment shader compilation error:\n"+glGetShaderInfoLog(frag));
        }
    
        int prog=glCreateProgram();
        glAttachShader(prog, vert);
        glAttachShader(prog, frag);
        glLinkProgram(prog);
    
        float[]vboData=new float[] {
            0,0,0,
            1,0,0,
            0,1,0
        };
    
        int vao=glGenVertexArrays();
        int vbo=glGenBuffers();
    
    
        glBindVertexArray(vao);
    
        glBindBuffer(GL_ARRAY_BUFFER,vbo);
        glBufferData(GL_ARRAY_BUFFER, FloatBuffer.wrap(vboData), GL_STATIC_DRAW);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 3, GL_FLOAT, false, 3*Float.BYTES, 0);
    
        glBindVertexArray(0);
    
    
        System.out.println("prog="+prog+",vert="+vert+",frag="+frag);
        System.out.println("vao="+vao+",vbo="+vbo);
    
        while (!glfwWindowShouldClose(window)) {
          glClearColor(1, 1, 1, 1);
          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
          glUseProgram(prog);
    
          glBindVertexArray(vao);
    //      glDrawElements(GL_TRIANGLES, indices);
          glDrawArrays(GL_TRIANGLES, 0, 3);
          glBindVertexArray(0);
    
          glUseProgram(0);
    
          glfwSwapBuffers(window);
          glfwPollEvents();
        }
    
        glfwDestroyWindow(window);
        glfwTerminate();
    
      }
    
    }
    

    这是它的指纹:

    Version       : 4.1 ATI-1.66.31
    Vendor        : ATI Technologies Inc.
    Renderer      : AMD Radeon Pro 560 OpenGL Engine
    GLSL version  : 4.10
    Major version : 4
    Minor version : 1
    prog=3,vert=1,frag=2
    vao=1,vbo=1
    

    因此正确地生成了着色器和vao/vbos。

    顶点着色器:

    #version 410 core
    
    layout (location = 0) in vec3 inPos;
    
    out vec4 outPos;
    
    void main(){
        outPos=vec4(inPos,1.0);
    }
    

    碎片着色器:

    #version 410 core
    
    out vec4 fragColor;
    
    void main(){
        fragColor=vec4(0.0,0.0,0.0,1.0);
    }
    

    我在MacOS High Sierra版本10.13.4上。

    绘图:

    Radeon Pro 560 4096 MB
    Intel HD Graphics 630 1536 MB
    

    它显示一个宽度、高度和标题都正确的白色窗口。 我认为问题是在我的GLVICTASTURBITCHOVER调用中,我听到了一些所谓的“缓冲翻转”的现象。

    编辑:

    对于某些注释,使用此顶点着色器:

    #version 410 core
    
    layout (location = 0) in vec3 inPos;
    
    void main(){
        gl_Position=vec4(inPos,1.0);
    }
    

    什么都没变。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Rabbid76    6 年前

    你必须写信给 gl_Position 在顶点着色器中。写入的齐次坐标 总帐位置 用于基元程序集。不能像在片段着色器中那样指定自己的“输出”变量。中的输出变量 Vertex Shader 是可变变量,传递到管道的下一部分。

    #version 410 core
    
    layout (location = 0) in vec3 inPos;
    
    void main()
    {
        gl_Position = vec4(inPos, 1.0);
    }
    

    GLSL - The OpenGL Shading Language 4.6; 7.1.1. Vertex Shader Special Variables; page 131

    变量 总帐位置 用于写入齐次顶点位置。它可以在着色器执行的任何时候写入。此值将用于原始组件、剪裁、剔除和其他固定功能操作,如果存在,则在顶点处理发生之后对原语进行操作。在顶点处理阶段如果顶点没有定义它的值 着色器可执行文件不写入 总帐位置 是的。


    你还必须 flip() 数据传输到缓冲区后的缓冲区。参见ALOS:

    float[]vboData=new float[] { 0,0,0,  1,0,0,  0,1,0 };
    
    FloatBuffer buf = BufferUtils.createFloatBuffer(vboData.length);
    buf.put(vboData).flip();
    
    glBufferData(GL_ARRAY_BUFFER, buf, GL_STATIC_DRAW);
    

    说明:

    put(vboData) 从当前位置(在本例中是缓冲区的起始位置)开始,将数据传输到缓冲区。缓冲区位置随数据大小而递增。所以新的缓冲区位置在新数据的末尾。

    FLIP() 将缓冲区的限制(长度)设置为当前位置,然后将该位置设置为零。

    当您将缓冲区数据传递给 glBufferData ,将检索指向缓冲区当前位置的数据的指针。

        2
  •  0
  •   Gavrilo Adamovic    6 年前

    顶点着色器输出的顶点位置存储在 gl_Position 向量,所以试试

    gl_Position = vec4(inPos,1.0);