OpenGL(LWJGL) VBO Quad чертеж се срива

В момента изучавам Vertex Arrays и b/c на VBO. В момента научих, че е по-добро/по-бързо от „незабавното“ изобразяване (като използването на glBegin), въпреки че е много по-лесно. Направих малка програма (наистина само тест), която създава бутон и когато задържите курсора на мишката върху бутона, той променя цвета си, но когато я стартирам, програмата се срива със следното съобщение за грешка:

A fatal error has been detected by the Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006875c490, pid=5708, tid=7148

JRE version: 7.0_21-b11
Java VM: Java HotSpot(TM) 64-Bit Server VM (23.21-b01 mixed mode windows-amd64 compressed oops)
Problematic frame:
C  [atio6axx.dll+0x20c490]  DrvPresentBuffers+0x1cb680

Failed to write core dump. Minidumps are not enabled by default on client versions of   Windows

 An error report file with more information is saved as:
C:\Users\UserNameHere\Desktop\Java\workspace\LWJGL Tutorials\hs_err_pid5708.log

If you would like to submit a bug report, please visit:
http://bugreport.sun.com/bugreport/crash.jsp
The crash happened outside the Java Virtual Machine in native code.
See problematic frame for where to report the bug.

Моят код

package testandothertutorials;

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

import java.nio.FloatBuffer;

import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;

public class VBOMenu {

int WIDTH = 640;
int HEIGHT = 480;
float button[] = {
        //Left bottom triangle
        30, 60, 0,
        30, 30, 0,
        60, 30, 0,
        //Right top triangle
        60, 30, 0,
        60, 60, 0,
        30, 60, 0
};

public VBOMenu() {
    try {
        Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
        Display.setTitle("Vertex Arrays Demo");
        Display.create();
    } catch(LWJGLException e) {
        Display.destroy();
    }

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 640, 480, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    final int amountOfVertices = 4;
    final int colorSize = 4;
    final int vertexSize = 4;

    FloatBuffer firstVertexData = BufferUtils.createFloatBuffer(button.length);
    firstVertexData.put(button);
    firstVertexData.flip();

    FloatBuffer unselColorData = BufferUtils.createFloatBuffer(colorSize); //The color that will be set when the menu is launched
    unselColorData.put(new float[] {0, 1, 0});
    unselColorData.flip();

    FloatBuffer selColorData = BufferUtils.createFloatBuffer(colorSize); //The color that will be set when the mouse hovers over the button
    selColorData.put(new float[] {0, 2, 0});
    selColorData.flip();

    int firstVertexHandle = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, firstVertexHandle);
    glBufferData(GL_ARRAY_BUFFER, firstVertexData, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    int unselColorHandle = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, unselColorHandle);
    glBufferData(GL_ARRAY_BUFFER, unselColorData, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    int selColorHandle = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, selColorHandle);
    glBufferData(GL_ARRAY_BUFFER, selColorData, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);


    boolean isRunning = true;

    while(isRunning) {
        glClear(GL_COLOR_BUFFER_BIT);

        glBindBuffer(GL_ARRAY_BUFFER, firstVertexHandle);
        glVertexPointer(vertexSize, GL_FLOAT, 0, 0l);

        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
        glDrawArrays(GL_TRIANGLES, 0, amountOfVertices);
        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);

        Display.update();
        Display.sync(60);

        if(Display.isCloseRequested())
            isRunning = false;
    }

    glDeleteBuffers(firstVertexHandle);

    Display.destroy();
}

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

}


person n1ghtk1n9    schedule 03.08.2013    source източник


Отговори (1)


Това е така, защото вие казвате на OpenGL, че искате да използвате цветен масив, така че когато OpenGL се опита да изобрази с помощта на Vertex и Color Buffers, той се проваля, защото не сте обвързали ColorBuffer.

Това е, което ви липсва.

glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glColorPointer(vertexSize, GL_FLOAT, 0, 0l);

Трябва да замените vbo_color_handle с вашия собствен идентификатор на цветен манипулатор.

По-добър пример

Освен това само като погледна кода ви, виждам, че не разбирате напълно как работи VBO, така че ето малък пример за VBO, който съхранява върхове и цветове за триъгълник и го изобразява!

Създаване на VBO.

Това е кодът, в който създавате действителния Vertex и Color Buffer и ги свързвате с VBO.

int vertices = 3;

int vertex_size = 3; // X, Y, Z
int color_size = 3; // R, G, B

FloatBuffer vertex_data = BufferTools.createFloatBuffer(vertices * vertex_size);
vertex_data.put(new float[] { -1f, -1f, 0f, });
vertex_data.put(new float[] { 1f, -1f, 0f, });
vertex_data.put(new float[] { 1f, 1f, 0f, });
vertex_data.flip();

FloatBuffer color_data = BufferTools.createFloatBuffer(vertices * color_size);
color_data.put(new float[] { 1f, 0f, 0f, });
color_data.put(new float[] { 0f, 1f, 0f, });
color_data.put(new float[] { 0f, 0f, 1f, });
color_data.flip();

vbo_vertex_handle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex_handle);
glBufferData(GL_ARRAY_BUFFER, vertex_data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

vbo_color_handle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glBufferData(GL_ARRAY_BUFFER, color_data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

Изобразяване на VBO.

Това е кодът, който трябва да извикате, за да изобразите VBO.

glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex_handle);
glVertexPointer(vertex_size, GL_FLOAT, 0, 0l);

glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glColorPointer(color_size, GL_FLOAT, 0, 0l);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glDrawArrays(GL_TRIANGLES, 0, vertices);

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
person vallentin    schedule 08.08.2013