【问题标题】:LWJGL3 OpenGL Triangle wont drawLWJGL3 OpenGL三角形不会绘制
【发布时间】:2015-10-30 18:40:42
【问题描述】:

您好,我一直在试图弄清楚为什么这个三角形不会绘制!这是我的代码。 它只是使用 VBO 和 VAO 的基本 LWJGL OpenGL 代码,我不知道为什么它不绘图。我已经确认着色器正在正确编译

//bindings available for use.
    GL.createCapabilities();

    // Set the clear color
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    float vertices[] = {
             0.0f,  0.5f, // Vertex 1 (X, Y)
             0.5f, -0.5f, // Vertex 2 (X, Y)
            -0.5f, -0.5f  // Vertex 3 (X, Y)
        };
    int vbo;
    vbo = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    FloatBuffer vboBuff = BufferUtils.createFloatBuffer(vertices.length);
    vboBuff.put(vertices);
    vboBuff.flip();
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vboBuff, GL15.GL_STATIC_DRAW);
    int vertShade = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertShade,Reader.read("shaders/main.frag"));
    glCompileShader(vertShade);
    int fragShade = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragShade,Reader.read("shaders/main.frag"));
    glCompileShader(fragShade);
    String failed = glGetShaderInfoLog(fragShade);
    System.err.println(failed);
    int shaderprogram = glCreateProgram();
    glAttachShader(shaderprogram,vertShade);
    glAttachShader(shaderprogram,fragShade);
    glLinkProgram(shaderprogram);
    glUseProgram(shaderprogram);
    int posAttrib = glGetAttribLocation(shaderprogram,"position");
    glVertexAttribPointer(posAttrib,2,GL_FLOAT,false,0,0);
    glEnableVertexAttribArray(posAttrib);
    int vao;
    vao = glGenVertexArrays();
    // Run the rendering loop until the user has attempted to close
    // the window or has pressed the ESCAPE key.
    while ( glfwWindowShouldClose(window) == GL_FALSE ) {;
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
     GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);

        glfwSwapBuffers(window); // swap the color buffers

        // Poll for window events. The key callback above will only be
        // invoked during this call.
        glfwPollEvents();
    }

SHADERS:///它们在单独的文件中 片段着色器:

#version 150

out vec4 outColor;

void main()
{
outColor = vec4(1.0, 1.0, 1.0, 1.0);
}

顶点

#version 150

in vec2 position;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
}

在 while 循环之前编辑最后几行现在看起来像这样:

    int shaderprogram = glCreateProgram();
    glAttachShader(shaderprogram,vertShade);
    glAttachShader(shaderprogram,fragShade);
    glLinkProgram(shaderprogram);
    glUseProgram(shaderprogram);
    int vao;
    vao = glGenVertexArrays();
    glBindVertexArray(vbo);
    int posAttrib = glGetAttribLocation(shaderprogram,"position");
    glVertexAttribPointer(posAttrib,2,GL_FLOAT,false,0,0);
    glEnableVertexAttribArray(posAttrib);

【问题讨论】:

  • @genpfault 哦,我可能在文档中错过了这样做的命令是什么?
  • 您正在构建相同的着色器两次。在两个glShaderSource() 调用中,文件名都是main.frag。如果您检查链接状态,您应该会看到它失败。

标签: java opengl graphics lwjgl


【解决方案1】:

查看您自己的代码应该会发现问题相当明显:

int vertShade = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertShade,Reader.read("shaders/main.frag"));
glCompileShader(vertShade);
int fragShade = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragShade,Reader.read("shaders/main.frag"));
glCompileShader(fragShade);

由于您在读取两个着色器时使用相同的文件名,因此您将片段着色器代码用于顶点着色器,并且从不加载顶点着色器代码。

如果你修正了文件名,事情应该会开始工作得更好。确保在开发期间构建着色器后始终检查编译和链接状态。然后您将能够快速识别这些类型的问题。

【讨论】:

  • 非常感谢你,我不敢相信我没有看到我正在编译相同的着色器。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多