Cześć.
Jako hobby piszę od czasu do czasu grę i mam kilka pytań dotyczących renderowania.
Dotychczas renderowałem starą i wolną metodą:
glBegin(GL11.GL_QUADS);
for(int j = 0; j<level.getGrid().getzSize();j++){
for(int i = 0; i<level.getGrid().getxSize();i++){
glVertex3f(i * squareSize + squareBorder,0,-(j+1) * squareSize + squareBorder);
glVertex3f(i * squareSize + squareBorder,0,-j * squareSize - squareBorder);
glVertex3f((i+1) * squareSize - squareBorder,0,-j * squareSize - squareBorder);
glVertex3f((i+1) * squareSize - squareBorder,0,-(j+1) * squareSize + squareBorder);
}
}
glEnd();
I myślę że juz czas przejść na nieco szybszy i mniej kłopotliwy sposób.
Czytałem trochę o VBO i innych metodach ale nie za bardzo rozumiem to co jest napisane w tutorialach.
W większości przypadków znajduję tylko jak coś zrobic bez wytłumaczenia dlaczego.
Na przykład:
public static int createVBOID() {
IntBuffer buffer = BufferUtils.createIntBuffer(1);
GL15.glGenBuffers(buffer);
//generowanie bufora? Co to w ogóle znaczy?
return buffer.get(0);
//i zwracanie nieprzewidywalnej wartosci z nowoutworzonego bufora?
}
public static void vertexBufferData(int id, FloatBuffer buffer) {
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, id); //Bind buffer (also specifies type of buffer)
//przywiązywanie bufora do id? Tylko ze w argumentach nie widze zadnego bufora
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); //Send up the data and specify usage hint.
}
public static void render() {
GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vertexBufferID);
GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0);
//czyli ustawiamy na vertex array, potem przywiazujemy(domyslam sie ze tutaj wybieramy skąd brać vertices)
GL11.glEnableClientState(GL11.GL_COLOR_ARRAY);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, colourBufferID);
GL11.glColorPointer(4, GL11.GL_FLOAT, 0, 0);
//If you are using IBOs:
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
GL11.glDrawElements(GL11.GL_TRIANGLES, numberIndices, GL11.GL_UNSIGNED_INT, 0);
}
Do tego, czy ta metoda jest odpowiednia jeśli renderuję cały czas używając tych samych vertexów (tak wcześniej jak pokazałem w przykładzie mojego kodu)?