OpenGL不会渲染我的网格

时间:2014-07-15 16:06:07

标签: java opengl lwjgl opengl-2.0

使用 LWJGL 我尝试渲染以在屏幕上呈现简单的网格,但OpenGL决定不采取任何措施。 :(

所以我有一个网格类,可以创建一个 VBO 。我可以添加一些顶点然后应该在屏幕上绘制。

public class Mesh {

    private int vbo;
    private int size = 0;

    public Mesh() {
        vbo = glGenBuffers();
    }

    public void addVertices(Vertex[] vertices) {
        size = vertices.length;

        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, Util.createFlippedBuffer(vertices), GL_STATIC_DRAW);
    }

    public void draw() {
        glEnableVertexAttribArray(0);

        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0);

        glDrawArrays(GL_TRIANGLES, 0, size);

        glDisableVertexAttribArray(0);
    }

}

以下是我向网格添加顶点的方法:

mesh = new Mesh();

Vertex[] vertices = new Vertex[] { new Vertex(new Vector3f(-1, -1, 0)),
                                   new Vertex(new Vector3f(-1, 1, 0)),
                                   new Vertex(new Vector3f(0, 1, 0)) };

mesh.addVertices(vertices);

我很确定我是按照正确的(时钟顺序)顺序添加它们的。

我的OpenGL设置:

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);

调用 glGetError()会返回错误(0)。

修改

嗯,我发现macs在OpenGL方面有点奇怪。我需要使用VAO和VBO。现在它工作正常。不管怎样,谢谢!

2 个答案:

答案 0 :(得分:0)

我没有看到你为输出或颜色或顶点数组指定着色器的任何地方。根据您使用的配置文件,您需要执行其中一个或多个配置文件。

我建议检查/设置以下内容

  • 禁用面部剔除,以确保无论缠绕如何,都应该看到
  • 如果您要求核心配置文件,则需要着色器并且很可能需要顶点数组对象
  • 如果您使用兼容性配置文件,则应在绘制调用中调用glColor3f(1,1,1)以确保不绘制黑色三角形
  • 您是否在渲染之前清除了帧缓冲区的颜色和深度?

答案 1 :(得分:0)

您可能无法在视锥体中绘制该对象,也可以调用glCheckError以确保您没有犯任何错误。

理解固定管道和可编程管道OpenGL之间的区别也很重要。如果您使用的是带有可编程管道的版本,则需要编写着色器,否则您将需要设置模型视图和投影矩阵。