Hello Guest

# Low FPS while redering VBO`s

• 0 Replies
• 408 Views

#### PrzemoVi

• 1
##### Low FPS while redering VBO`s
« on: October 11, 2017, 01:14:11 »
Hi everyone,

im new to OpenGL and of course lwjgl. I have a question about rendering using VBO.

I want to render ~50*50 object and for this i use VBO`s.
Each object has its own render method where binding of the position, rotation.

The Problem is i have a low Framerate (~10fps) but my objects (for now) consist of simple quads.

Later i want to use much more complex objects and other computations...

Thanks for help!

Pictrue in attachment!

Full code:

public class NGINE2 {
static int w = 640;
static int h = 480;
static float oldX = 0;
static float oldY = 0;
static float oldZ = 0;
static List<Triangle> triangles = new ArrayList<Triangle>();

public static void main(String[] args) throws Exception {
// System.out.println("Hello world from OpenGL!");

Random rand = new Random();
for (int x = 0; x < 50; x++) {
for (int z = 0; z < 50; z++) {
float rgb[] = new float[3];
rgb[0] = rand.nextFloat();
rgb[1] = rand.nextFloat();
rgb[2] = rand.nextFloat();
triangles.add(new Triangle(new Vector3f(x, 1, z), new Vector3f(+0.5f, 1f, -0.5f),
new Vector3f(-0.5f, 1f, -0.5f), new Vector3f(+0.5f, 1f, +0.5f), rgb, rgb, rgb));
triangles.add(new Triangle(new Vector3f(x, 1, z), new Vector3f(-0.5f, 1f, +0.5f),
new Vector3f(-0.5f, 1f, -0.5f), new Vector3f(+0.5f, 1f, +0.5f), rgb, rgb, rgb));
}
}

initContext();
renderLoop();

int height = 500;
int width = 500;
double value[][] = new double[500][500];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
double nx = x / width - 0.5, ny = y / height - 0.5;
value[y]
• = SimplexNoise.noise(nx, ny);

}
}
}

static void initContext() throws Exception {
Camera.create();

w = 640;
h = 480;

Display.setDisplayMode(new DisplayMode(w, h));
Display.setFullscreen(false);
Display.create();
glViewport(0, 0, w, h);
}

static void renderLoop() {
while (!Display.isCloseRequested()) {
preRender();
render();

Display.update();
Display.sync(300 /* desired fps */);
}

Display.destroy();
}

static void preRender() {

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);

GLU.gluPerspective(45.0f, ((float) w / (float) h), 0.1f, 100.0f); // fix na błąd z kamerą

glMatrixMode(GL_MODELVIEW);
}

static void drawVBOtriangle(float s1[], float s2[], float s3[]) {
// create geometry buffers
FloatBuffer cBuffer = BufferUtils.createFloatBuffer(9);
cBuffer.put(s1[3]).put(s1[4]).put(s1[5]);
cBuffer.put(s2[3]).put(s2[4]).put(s2[5]);
cBuffer.put(s3[3]).put(s3[4]).put(s3[5]);
cBuffer.flip();

FloatBuffer vBuffer = BufferUtils.createFloatBuffer(9);
vBuffer.put(s1[0]).put(s1[1]).put(s1[2]);
vBuffer.put(s2[0]).put(s2[1]).put(s2[2]);
vBuffer.put(s3[0]).put(s3[1]).put(s3[2]);
vBuffer.flip();

IntBuffer ib = BufferUtils.createIntBuffer(2);

glGenBuffersARB(ib);
int vHandle = ib.get(0);
int cHandle = ib.get(1);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, vBuffer, GL_STATIC_DRAW_ARB);
glVertexPointer(3, GL_FLOAT, /* stride */3 << 2, 0L);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, cBuffer, GL_STATIC_DRAW_ARB);
glColorPointer(3, GL_FLOAT, /* stride */3 << 2, 0L);

glDrawArrays(GL_TRIANGLES, 0, 3 /* elements */);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

// cleanup VBO handles
ib.put(0, vHandle);
ib.put(1, cHandle);
glDeleteBuffersARB(ib);
}

static void render() {
glClearColor(1, 1, 1, 1);

Camera.acceptInput(0.6f);
Camera.apply();

for (int i = 0; i < triangles.size(); i++) {
// rysowanie trójkąta z modów...
float s1[] = new float[6];
s1[0] = triangles.get(i).getFirstModPoint().getX();
s1[1] = triangles.get(i).getFirstModPoint().getY();
s1[2] = triangles.get(i).getFirstModPoint().getZ();
s1[3] = triangles.get(i).getFirstColor()[0];
s1[4] = triangles.get(i).getFirstColor()[1];
s1[5] = triangles.get(i).getFirstColor()[2];
float s2[] = new float[6];
s2[0] = triangles.get(i).getSecondModPoint().getX();
s2[1] = triangles.get(i).getSecondModPoint().getY();
s2[2] = triangles.get(i).getSecondModPoint().getZ();
s2[3] = triangles.get(i).getSecondColor()[0];
s2[4] = triangles.get(i).getSecondColor()[1];
s2[5] = triangles.get(i).getSecondColor()[2];
float s3[] = new float[6];
s3[0] = triangles.get(i).getThirdModPoint().getX();
s3[1] = triangles.get(i).getThirdModPoint().getY();
s3[2] = triangles.get(i).getThirdModPoint().getZ();
s3[3] = triangles.get(i).getThirdColor()[0];
s3[4] = triangles.get(i).getThirdColor()[1];
s3[5] = triangles.get(i).getThirdColor()[2];
drawVBOtriangle(s1, s2, s3);
glTranslatef(triangles.get(i).getStartPoint().x - oldX, triangles.get(i).getStartPoint().y - oldY, triangles.get(i).getStartPoint().z - oldZ);
oldX = triangles.get(i).getStartPoint().x;
oldY = triangles.get(i).getStartPoint().y;
oldZ = triangles.get(i).getStartPoint().z;
}
}

public static Vector3f getDirection() {
Vector3f vector = new Vector3f();

float rotX = Camera.getRotationX(); // pitch
float rotY = Camera.getRotationY(); // yaw