2014-10-14 11 views
0

Я следую учебному пособию по созданию игрового движка в Java с использованием OpenGL.Треугольник не в OpenGL 2.1 на OSX

Я пытаюсь отобразить треугольник на экране. Все работает нормально, и я могу изменить цвет фона, но треугольник не будет отображаться. Я также попытался запустить код, предоставленный как часть серии уроков, и он все еще не работает.

Ссылка на учебник: http://bit.ly/1EUnvz4

Ссылка на код, используемый в видео: http://bit.ly/1z7XUlE

Setup

  • Я попытался проверки OpenGL версии и Belive У меня есть 2.1 ,
  • Mac OSX
  • Java - Затмение

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; 
    } 
} 
+0

аннотация рядом с концом видео говорит, что вам может понадобиться шейдер –

+0

О, вы правы! Я путешествовал, поэтому я загрузил видео и не видел его. Все еще есть кое-что, чтобы разобраться, но спасибо :) –

ответ

1

Вы используете недопустимое сочетание старого и современного OpenGL.

glVertexAttribPointer() В и glEnableVertexAttribArray() функции вы звонящая используется для создания общих атрибутов вершин. Это единственный способ настроить атрибуты вершин в текущих версиях OpenGL (основной профиль рабочего стола OpenGL или OpenGL ES 2.0 и более поздних версий). Их можно использовать и в старых версиях OpenGL, но только в сочетании с предоставлением собственных шейдеров, реализованных в GLSL.

Если вы только начинаете, лучший вариант - это, вероятно, придерживаться того, что у вас есть, и изучить, как начать реализацию ваших собственных шейдеров. Если вы хотите, чтобы код работал с устаревшим фиксированным конвейером (который поддерживается только в профиле совместимости OpenGL), вам нужно будет использовать функции glVertexPointer() и glEnableClientState().

+0

Спасибо за помощь! Мне удалось запустить OpenGL 4.1 на Mavericks с помощью этого руководства: [link] (http://lwjgl.org/wiki/index.php?title=Version_selection) Следующий шаг: добавление шейдера GLSL! –

0

Попробуйте ввести один импорт?

import static org.lwjgl.opengl.GL11.* 

У меня только один импорт на мой, также попробуйте импортировать необходимые вам пакеты. Одна вещь, которую вы, вероятно, ошибаетесь, заключается в импорте нескольких версий OpenGL