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)。

编辑:

好吧,我发现 Mac 在 OpenGL 方面有点奇怪。我需要将 VAO 与 VBO 一起使用。现在它工作正常。不管怎么说,还是要谢谢你!

4

2 回答 2

0

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

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

于 2014-07-15T19:45:54.850 回答
0

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

我建议检查/设置以下

  • 禁用面部剔除以确保无论缠绕如何,您都应该看到一些东西
  • 如果您正在请求核心配置文件,您将需要一个着色器,并且很可能需要一个顶点数组对象
  • 如果您改用兼容性配置文件,则应在绘图调用中调用 glColor3f(1, 1, 1) 以确保您没有绘制黑色三角形
  • 您是否在渲染之前清除颜色和深度帧缓冲区?
于 2014-07-15T19:26:30.337 回答