Triangle not drawing in OpenGL 2.1 on OSX

∥☆過路亽.° 提交于 2019-12-01 12:07:28

问题


I'm following a tutorial on creating a Game Engine in Java using OpenGL.

I'm trying to render a triangle on the screen. Everything is running fine and I can change the background color but the triangle won't show. I've also tried running the code provided as part of the tutorial series and it still doesn't work.

Link to the tutorial: http://bit.ly/1EUnvz4

Link to the code used in the video: http://bit.ly/1z7XUlE

Setup

  • I've tried checking for OpenGL version and belive I have 2.1.
  • Mac OSX
  • Java - Eclipse

Mesh.java

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;

public class Mesh
{
    private int vbo;    //pointer to the buffer
    private int size;   //size of the data to buffer

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

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

        //add the data by first binding the buffer
        glBindBuffer (GL_ARRAY_BUFFER, vbo);    //vbo is now the buffer
        //and then buffering the data
        glBufferData (GL_ARRAY_BUFFER, Util.createFlippedBuffer(vertices), GL_STATIC_DRAW);
    }

    public void draw ()
    {
        glEnableVertexAttribArray (0);  //divide up the data into a segment

        glBindBuffer (GL_ARRAY_BUFFER, vbo);    //vbo is now the buffer
        //tell OpenGL more about the segment:
        //segment = 0, elements = 3, type = float, normalize? = false, vertex size, where to start = 0)
        glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0);

        //draw GL_TRIANGLES starting from '0' with a given 'size'
        glDrawArrays (GL_TRIANGLES, 0, size);

        glDisableVertexAttribArray (0);
    }
}

RenderUtil.java

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL30.*;

public class RenderUtil
{
    public static void clearScreen ()
    {
        //TODO: Stencil Buffer
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }

//set everything to engine defaults
public static void initGraphics ()
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);   // default color

    glFrontFace(GL_CW);         // direction for visible faces
    glCullFace(GL_BACK);        // direction for back faces
    glEnable (GL_CULL_FACE);    // don't draw back faces
    glEnable (GL_DEPTH_TEST);   // determines draw order by pixel depth testing

    //TODO: Depth clamp for later

    glEnable (GL_FRAMEBUFFER_SRGB); // do exponential correction on gamma so we don't have to
}
}

Util.java

import java.nio.FloatBuffer;
import org.lwjgl.BufferUtils;

public class Util
{
    //create a float buffer (we need this because java is weird)
    public static FloatBuffer createFloatBuffer (int size)
    {
        return BufferUtils.createFloatBuffer(size);
    }

    //flip the buffer to fit what OpenGL expects
    public static FloatBuffer createFlippedBuffer (Vertex[] vertices)
    {
        FloatBuffer buffer = createFloatBuffer(vertices.length * Vertex.SIZE);

        for (int i = 0; i < vertices.length; i++)
        {
            buffer.put(vertices[i].getPos().getX());
            buffer.put(vertices[i].getPos().getY());
            buffer.put(vertices[i].getPos().getZ());
        }

        buffer.flip();

        return buffer;
    }
}

回答1:


You are using an invalid mix of legacy and modern OpenGL.

The glVertexAttribPointer() and glEnableVertexAttribArray() functions you are calling are used for setting up generic vertex attributes. This is the only way to set up vertex attribues in current versions of OpenGL (Core Profile of desktop OpenGL, or OpenGL ES 2.0 and later). They can be used in older versions of OpenGL as well, but only in combination with providing your own shaders implemented in GLSL.

If you are just getting started, your best option is probably to stick with what you have, and study how to start implementing your own shaders. If you wanted to get the code working with the legacy fixed pipeline (which is only supported in the Compatibility Profile of OpenGL), you would need to use the glVertexPointer() and glEnableClientState() functions instead.




回答2:


Try a single import?

import static org.lwjgl.opengl.GL11.*

I only have one import on mine, also try importing the packages you need separately. One thing you are likely doing wrong is importing multiple versions of OpenGL



来源:https://stackoverflow.com/questions/26367452/triangle-not-drawing-in-opengl-2-1-on-osx

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!