2016-09-29 6 views
0

Я разрабатываю 2D-игру под названием Spaceland, и у меня возникла проблема с очисткой экрана. Всякий раз, когда я вызываю glClear(GL_COLOR_BUFFER_BIT) каждый кадр, он держит мой экран черным, пока я перестаю его называть. Я проверил это, присвоив glClear() ключу, и когда я удерживаю его, экран становится черным, когда он не нажимается, квадрат, который распространяется по экрану, просто растет, пока я не очистится.glClear() держит экран черный

Я использую glClearColor(0, 0, 0, 1), когда создаю окно. Я попытался выключить и на glfwSwapInterval().

create() функция в моем классе Window:

public void create(boolean vsync) { 
    GLFWErrorCallback.createPrint(System.err).set(); 

    GLFWVidMode vid = glfwGetVideoMode(glfwGetPrimaryMonitor()); 

    keys = new boolean[GLFW_KEY_LAST]; 
    for (int i = 0; i < GLFW_KEY_LAST; i ++) { 
     keys[i] = false; 
    } 

    glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); 

    ID = glfwCreateWindow(vid.width(), vid.height(), TITLE, glfwGetPrimaryMonitor(), 0); 
    if (ID == 0) 
     throw new IllegalStateException("Error whilst creating window: '" + TITLE + "'"); 

    glfwMakeContextCurrent(ID); 
    createCapabilities(); 

    glClearColor(0, 0, 0, 1); 

    camera = new Camera(getWidth(), getHeight()); 

    glfwSwapInterval(vsync ? 1 : 0); 
} 

Sprite Класс:

public class Sprite { 
private VertexArray vao; 
private VertexBuffer 
     pVbo, 
     iVbo; 

private int vertexCount; 

private float scale; 

private Vector3f position; 
private Vector3f rotation; 

private Matrix4f tMatrix; 

public Sprite(float[] pos, int[] indices) { 
    vertexCount = indices.length; 

    position = new Vector3f(0, 0, 0); 
    rotation = new Vector3f(0, 0, 0); 
    scale = 0.1f; 

    tMatrix = MatrixHelper.createTransformationMatrix(position, rotation, scale); 

    vao = new VertexArray(); 
    pVbo = new VertexBuffer(false); 
    iVbo = new VertexBuffer(true); 

    vao.bind(); 

    pVbo.bind(); 
    pVbo.add(pos); 
    vao.add(); 
    pVbo.unbind(); 

    iVbo.bind(); 
    iVbo.add(indices); 
    iVbo.unbind(); 

    vao.unbind(); 
} 

public void setPosition(float x, float y, float z) { 
    position.x = x; 
    position.y = y; 
    position.z = z; 
} 

public void setRotation(Vector3f rot) { 
    rotation = rot; 
} 

public void render(int renderType) { 
    MatrixHelper.setTMatrixPosition(tMatrix, position); 
    setPosition(getPosition().x + 0.0001f, 0, 0); 

    System.out.println(tMatrix); 

    Spaceland.shader.bind(); 
    Spaceland.shader.editValue("transformation", tMatrix); 

    vao.bind(); 
    glEnableVertexAttribArray(0); 
    iVbo.bind(); 

    glDrawElements(renderType, vertexCount, GL_UNSIGNED_INT, 0); 

    iVbo.unbind(); 
    glDisableVertexAttribArray(0); 
    vao.unbind(); 

    Spaceland.shader.unbind(); 
} 

public Vector3f getPosition() { 
    return position; 
} 
} 

Я не думаю, что вам нужно, чтобы мой Camera класс или класс MatrixHelper как проблема произошла перед внедрением это.

Основной класс (игнорировать rose[] и roseI[] это просто круто образец, который я сделал в качестве теста):

public class Spaceland { 
public static Window window; 

public static Sprite sprite; 

public static Shader shader; 

public static float[] rose = { 
     -0.45f, 0f, 
     0.45f, 0f, 
     0f, 0.45f, 
     0f, -0.45f, 
     -0.4f, -0.2f, 
     -0.4f, 0.2f, 
     0.4f, -0.2f, 
     0.4f, 0.2f, 
     -0.2f, -0.4f, 
     -0.2f, 0.4f, 
     0.2f, -0.4f, 
     0.2f, 0.4f 
}; 

public static int[] roseI = { 
     0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 

     1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11, 

     2, 3, 2, 4, 2, 5, 2, 6, 2, 7, 2, 8, 2, 9, 2, 10, 2, 11, 

     3, 4, 3, 5, 3, 6, 3, 7, 3, 8, 3, 9, 3, 10, 3, 11, 

     4, 5, 4, 6, 4, 7, 4, 8, 4, 9, 4, 10, 4, 11, 

     5, 6, 5, 7, 5, 8, 5, 9, 5, 10, 5, 11, 

     6, 7, 6, 8, 6, 9, 6, 10, 6, 11, 

     7, 8, 7, 9, 7, 10, 7, 11, 

     8, 9, 8, 10, 8, 11, 

     9, 10, 9, 11, 

     10, 11, 
}; 

public static float[] quad = { 
     0.5f, 0.5f, 
     0.5f, -0.5f, 
     -0.5f, 0.5f, 
     -0.5f, -0.5f 
}; 

public static int[] quadI = { 
     2, 0, 3, 
     0, 1, 3 
}; 

public static void main(String[] args) { 
    init(); 
} 

public static void loop() { 
    while (!window.isCloseRequested()) { 
     update(); 
     render(); 
    } 

    destroy(0); 
} 

public static void init() { 
    if (!glfwInit()) 
     throw new IllegalStateException("Error whilst initialising GLFW"); 

    window = new Window("Spaceland"); 

    window.create(true); 

    shader = new Shader("src/main/java/com/spaceland/graphics/fragment.fs", "src/main/java/com/spaceland/graphics/vertex.vs"); 

    sprite = new Sprite(quad, quadI); 

    loop(); 
} 

public static void render() { 
    window.render(); 

    sprite.render(GL11.GL_TRIANGLES); 
} 

public static void update() { 
    window.update(); 

    if (window.isDown(GLFW_KEY_SPACE)) { 
     glClear(GL_COLOR_BUFFER_BIT); 
    } 
} 

public static void destroy(int error) { 
    window.destroy(); 

    glfwTerminate(); 
    glfwSetErrorCallback(null).free(); 

    shader.destroy(); 

    VertexBuffer.deleteAll(); 
    VertexArray.destroyAll(); 

    System.exit(error); 
} 
} 

Пожалуйста, скажите мне, если вам нужно, чтобы увидеть Shader класс, затенение против и фс файлов, или что-нибудь остальное.

Спасибо!

+0

Или я что-то пропустил, или, поскольку вы установили 'glClearColor()' to '0, 0, 0, 1', это абсолютно нормально, чтобы очистить экран до черного. Попробуйте что-нибудь фантастическое, как 0,42, 0,28, 0.78 – Zouch

ответ

0

Это не очень ясно в моем вопросе, но ответ заключается в том, что я очистил экран, поменял буфер, визуализировал и т. Д. Что не работает.

glClear(...); 
glfwSwapBuffers(...); 
...render... 

Так оно и есть в настоящее время, и это не сработает.

glClear(...); 
...render... 
glfwSwapBuffers(...); 

Вот как я это делаю сейчас, и он отлично работает.

+0

Я действительно не знал, что хорошо, тогда ... –

1

glClear влияет на выходные буферы. Так что это часть рендеринга. Если вы хотите очистить часть рендеринга, поставьте glClear внутри своей функции render.

У вас его внутри update. Я подозреваю, что кто-то звонит render и update (LWJGL, предположительно?) Не гарантирует никакого конкретного заказа. Поэтому каждый раз, когда вас просят обновить, вы топаете поверх того, что вы оказали.

Обновления:

  • регулировать внутреннее состояние, как правило, частично в зависимости от времени.

Визуализирует: текущее состояние

  • захвата визуально.
+0

'render()' и 'update()' вызывается функцией 'loop()'. –

Смежные вопросы