Trouble with Vertex Arrays

Started by
4 comments, last by V-man 15 years, 7 months ago
After reading all of the Opengl super bible and opengl game programming and searching through gamedev and NeHe, I still cant get my program to display the model i load using vertex arrays(or immediate mode), and ive verified that my model loading works by comparing the loaded data with the .obj file. THis is my whole rendering function: GLfloat vect[1000][2]; static GLfloat xRot = 0.0f; static GLfloat yRot = 0.0f; unsigned ind[3000]; GLfloat x,y,z,angle; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glPushMatrix(); glRotatef(xRot, 1.0f, 0.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 0.0f); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3,GL_FLOAT,0,vect); glColor3f(0.0f, 1.0f, 0.0f); glDrawElements(GL_TRIANGLES, 36,GL_UNSIGNED_BYTE,&ind); glPopMatrix(); // Flush drawing commands glutSwapBuffers(); When I run it nothing appears unless i tell it to do lines, then it draws some of it messed up.
Advertisement
What's in your 'ind' array. It's not shown in the listing.
EDIT - Just spotted it. But can you explain what you have in ind and array.
And is your compiler ok with just 'unsigned' in-front of 'ind'?

What .obj file are you loading, and what are you doing with it?

And it's a small point, but why is your vect array [1000] by [2]?

In theory (at first glance) what you have there may just draw something, but the data you are supplying it is obviously not formatted as OpenGL expects..

To help I, or anyone, would need more info...

I would suggest you start with a hand made non-Element Array cube of some sort, and then go from there in steps.
Feel free to 'rate me down', especially when I prove you wrong, because it will make you feel better for a second....
The ind array is my indices. The obj file im loading is just a cube exported from milkshape. The vect is by 2 for the x,y,z of each vertex. Heres the full code:
#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/glut.h>
#include <math.h>
#include <fstream>
#include <string>
#include <sstream>

#include <iostream>
using namespace std;
// Define a constant for the value of PI
#define GL_PI 3.1415f

// Rotation amounts
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
unsigned ind[3000];
struct GLTVector3
{
float x,y,z;
};
GLfloat vect[1000][2];
GLTVector3 vec[1000];
GLTVector3 nor[1000];
void RenderScene(void)
{
GLfloat x,y,z,angle;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,0,vect);
glColor3f(0.0f, 1.0f, 0.0f);
glDrawElements(GL_TRIANGLES, 36,GL_UNSIGNED_BYTE,&ind);
/*
glBegin(GL_TRIANGLES);
int i; for(i=0;i<indat;i++)
{
glVertex3f(vec[ind].x,vec[ind].y,vec[ind].z);
}
glEnd();*/
glPopMatrix();
// Flush drawing commands
glutSwapBuffers();
}

// This function does any needed initialization on the rendering
// context.
void SetupRC()
{
// Black background
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );

// Set drawing color to green
glColor3f(0.0f, 1.0f, 0.0f);
}

void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_UP)
xRot-= 5.0f;

if(key == GLUT_KEY_DOWN)
xRot += 5.0f;

if(key == GLUT_KEY_LEFT)
yRot -= 5.0f;

if(key == GLUT_KEY_RIGHT)
yRot += 5.0f;

if(key > 356.0f)
xRot = 0.0f;

if(key < -1.0f)
xRot = 355.0f;

if(key > 356.0f)
yRot = 0.0f;

if(key < -1.0f)
yRot = 355.0f;

// Refresh the Window
glutPostRedisplay();
}


void ChangeSize(int w, int h)
{
GLfloat nRange = 100.0f;

// Prevent a divide by zero
if(h == 0)
h = 1;

// Set Viewport to window dimensions
glViewport(0, 0, w, h);

// Reset projection matrix stack
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Establish clipping volume (left, right, bottom, top, near, far)
if (w <= h)
glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
else
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

// Reset Model view matrix stack
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void extract_indices_from_string(string str, unsigned &vi, unsigned ∋, unsigned &ti)
{
string v;
string t;
string n;

string *tmp[3] = {&v, &t, &n};

int tidx = 0;
string *target = tmp[0];

for (size_t i = 0; i < str.size(); ++i) {
if (str == '/') target = tmp[++tidx];
else *target += str;
}

istringstream iss1(v);
vi = 0;
iss1 >> vi;

istringstream iss2(t);
ti = 0;
iss2 >> ti;

istringstream iss3(n);
ni = 0;
iss3 >> ni;
}

int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("Points Example");
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
SetupRC();
ifstream in("box.obj", ios::in);
int vecat=0;
int norat=0;
int indat=0;
unsigned temp;
while (in) {
string line;
getline(in, line);
istringstream iss;
iss.str(line);
string cmd;
iss >> cmd;

if (cmd[0] == '#') continue;
else if (cmd == "v") {
iss >> vec[vecat].x >> vec[vecat].y >> vec[vecat].z;
printf("%f,%f,%f\n",vec[vecat].x,vec[vecat].y,vec[vecat].z);
vec[vecat].x*=10;
vec[vecat].y*=10;
vec[vecat].z*=10;
//vect[vecat][0]=vec[vecat].x;
//vect[vecat][1]=vec[vecat].y;
//vect[vecat][2]=vec[vecat].z;
vecat++;
} else if (cmd == "vn") {
iss >> nor[norat].x >> nor[norat].y >> vec[norat].z;
norat++;
} else if (cmd == "vt") {
} else if (cmd == "f") {
//iss >> ind[indat] >> "/" >> temp >> "/" >> temp;
//ind[indat]--;
//indat++;
while (iss) {
string word;
iss >> word;
if (word == "") continue;
extract_indices_from_string(word, ind[indat], temp, temp);
ind[indat]--;
printf("%i ",ind[indat]);
indat++;
}
}
}

glutMainLoop();

return 0;
}

and heres the obj file
# Wavefront OBJ exported by MilkShape 3D

v -3.000000 3.083333 3.041667
v -3.000000 -3.000000 3.041667
v 3.000000 3.083333 3.041667
v 3.000000 -3.000000 3.041667
v 3.000000 3.083333 -3.041667
v 3.000000 -3.000000 -3.041667
v -3.000000 3.083333 -3.041667
v -3.000000 -3.000000 -3.041667
# 8 vertices

vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 1.000000
vt 1.000000 0.000000
# 4 texture coordinates

vn 0.000000 0.000000 1.000000
vn 1.000000 0.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn -1.000000 0.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 -1.000000 0.000000
# 6 normals

g Box02
s 1
f 1/1/1 2/2/1 3/3/1
f 2/2/1 4/4/1 3/3/1
s 2
f 3/1/2 4/2/2 5/3/2
f 4/2/2 6/4/2 5/3/2
s 1
f 5/1/3 6/2/3 7/3/3
f 6/2/3 8/4/3 7/3/3
s 2
f 7/1/4 8/2/4 1/3/4
f 8/2/4 2/4/4 1/3/4
s 3
f 7/1/5 1/2/5 5/3/5
f 1/2/5 3/4/5 5/3/5
f 2/1/6 8/2/6 4/3/6
f 8/2/6 6/4/6 4/3/6
# 12 triangles in group

# 12 triangles total


Shouldn't it be

glDrawElements(GL_TRIANGLES, 36,GL_UNSIGNED_BYTE, ind);

or even

glDrawElements(GL_TRIANGLES, 36,GL_UNSIGNED_BYTE, &ind[0]);

instead of

glDrawElements(GL_TRIANGLES, 36,GL_UNSIGNED_BYTE,&ind);

You're passing an address to a pointer instead of the pointer itself.
Quote:Original post by Jaska
Shouldn't it be

glDrawElements(GL_TRIANGLES, 36,GL_UNSIGNED_BYTE, ind);

or even

glDrawElements(GL_TRIANGLES, 36,GL_UNSIGNED_BYTE, &ind[0]);

instead of

glDrawElements(GL_TRIANGLES, 36,GL_UNSIGNED_BYTE,&ind);

You're passing an address to a pointer instead of the pointer itself.

He's passing the address of an array, not the address of a pointer. All three of your suggestions will give you the same pointer after array-to-pointer decay.
Also he is declared ind as unsigned which I guess means unsigned int so you need to use GL_UNSIGNED_INT.
Sig: http://glhlib.sourceforge.net
an open source GLU replacement library. Much more modern than GLU.
float matrix[16], inverse_matrix[16];
glhLoadIdentityf2(matrix);
glhTranslatef2(matrix, 0.0, 0.0, 5.0);
glhRotateAboutXf2(matrix, angleInRadians);
glhScalef2(matrix, 1.0, 1.0, -1.0);
glhQuickInvertMatrixf2(matrix, inverse_matrix);
glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);

This topic is closed to new replies.

Advertisement