Jump to content
  • Advertisement
Sign in to follow this  
Love3DGraphiks

OpenGL Normal Vector in OpenGL

This topic is 4451 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

1. I would Lkie ask sum thing about Vector Normal in OpenGl when we specify things like this glBegin(GL_QUADS) glNormal3f(0,0,1); glVertex3f(100,100,0); glVertex3f(100,100,200); glNormal3f(0,1,0); glVertex3f(50,50,0); .... sum like dat I wanna ask does OPENGL store Normal Vector like a list or OPENGL just have one current Normal Vector ? if in the Code above we dont specify the any Normal Vector ,so wat will happen when the Vertices are drawn to the Buffer and in dat case how the Normal Vector be calculates 2. Vertex Array I have code snippet like this: glEnableClientState(GL_VERTEX_ARRAY); glEnbaleClinetState(GL_NORMAL_ARRAY); my Array data is 4 3D-Points in the x-y plane for example
float MyArray[]={-50,-50,0
                 ,50,-50,0
                 ,50,50,0
                 ,-50,50,0} // A GL_CCW square lie in x-y plane
here is just 2 Normal Vectors for Example

float MyVector[]={0,0,1,
                  ,0,1,0};

glVertexPointer(3,GL_FLOAT,0,MyArray);
glNormalPointer(GL_FLOAT,0,MyVector);
glDrawArrays(GL_QUADS,0,4);

So I wanna ask when OpenGL Draw My Vertex Array ,which Vector Normal in My Vector Array will be Associated with which Vertex in my vertex Array ?
 or I maybe wrong in the way I specify all that thing ,coz I dun know much about this ,the book Im reading they dont get in detail
3. The last thing : What is Index Array Use for ??? In My Opinion it aint make sense . In the Book they say Index Vertex Array can share Vertices that means each Face can share vertices to each other ,and the datas dat specify the model will be smaller --> Faster performance At the first glance , It sounds resonable But I thinks the vertices OpenGl must Transforms and process are the same if we dont specify index vertex .Let me give example We specify a data array for a Cube: if we dont use index we have specify 4 points for each face of cube ,and the cube has 6 faces so we must specify total 6x4 =24 Vertices. and if we have OPENGL draw it with GL_QUADS ,it has to do 24 times tranformation if we use Vertex Array Index, the first thing we have to do is specify Vertext Array (Not index) ,and it just holds 8 Vertices But ur Index Vertex Array will hold the 24 Indexes so When we call glDrawElement(GL_QUADS,24,GL_UNSIGNED_BYTE,Indexes); for each Index OPENGL has to lookup in Vertex Array ,and then transform, and it has to transform 24 times coz we have 24 indexes so It aint make sense rite?? and we aint count the time it has to lookup for data in the Vertex Array ,if we do it must be slower than normal So what u think ? If I wrong just tell me , coz Im new to OPENGL Thanks

Share this post


Link to post
Share on other sites
Advertisement
1: The last normal issued is always associated with a vertex. OpenGL saves pretty much all states. The second vertex in your case gets the normal (0, 0, 1), since that was the last specified normal before that vertex was specified.

2: All attributes in a vertex array must be reached with the same index. That is, if you have four vertices but only two normals, you must dumplicate the normals so there are four normals aswell; exactly one normal for each vertex, no more, no less. If your vertex arrays are of different lengths, there is something wrong with them.

3: Now let's calculate the memory usage. Plain arrays is 3 (components per vertex) times 24 (number of vertices) times 4 (size of a float) is 288 bytes. Indexed arrays is 3*8*4 is 96 bytes, but add 24 (number of indices) times 4 (size of int), reaching a total of 192 bytes. So we have cut the memory usage down by ~33%.

Now think about the vertex cache also. Each vertex is shared among 3 faces, so using the index (they will all reference the same vertex), the vertex cache can skip re-transforming the vertex and just use the result from the last transform instead. Saves processing power.

Although it may not be as simple as this, it pretty much shows why they are usefull. But keep in mind that not all models gives you a ~33% memory reduction and 3 shared vertices; this scenario was very suitable for index arrays, but not all scenarios are. What's best vary from model to model.

edit: In point 3, I assume there's only the vertex position attribute present, and no normals, color, texture coordinates and such. If you add more attributes, the situation with the simple cube can very easily turn in to the worst case scenario for indexed arrays, leaving non-indexed arrays with the best choise.

Share this post


Link to post
Share on other sites
Yes, but the command itself will not be compiled into the display list, but the result of innvoking them will. That is, the geometry created by calling the vertex array functions is compiled into the display list.

Share this post


Link to post
Share on other sites
Thanks alot, I thought it will compile the command
So if we specify this in Display list like this

static float ang=45;

glMatrixMode(GL_MODELVIEW);
glNewList(somelist,GL_COMPILE);
glRotatef(ang,0,0,1);
glutSolidSphere(30,30,30);
glEndList();


thats wat I do in void Setup() for example

now in void RenderScene();

glCallList(somelist);
ang+=1.0;

when ang=46.0 in next Rendering ,does my sphere Rotate with ang =46 ??

Sum more question plzzz :p

In the book they say OpenGl has many Color Buffer
GL_FRONT ,GL_BACK,GL_LEFT, GL_RIGHT,GL_FRONT_LEFT,GL_FRONT_RIGHT....

1.GL_RIGHT and GL_BACK_RIGHT and others same same like that ,coz it say GL_xxx_RIGHT or GL_BACK_xxx ,are they relative to each other ?? or they are unique color buffers ?

2.I wrote an testing example ,and I caught some new problems ,I couldnt know how to explain for myself
My testing example is simple I draw a green square on the screen :


#include <gl/glut.h>
void Render()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0,1.0,0.0);
glRectf(-10.0,10.0,10.0,-10.0);
glutSwapBuffers();
}

void Change(GLsizei w,GLsizei h)
{
if(h==0)
h=1;
GLfloat k=float(w)/float(h);
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-100.0*k,100.0*k,-100.0,100.0,1.0,-1.0);
else
glOrtho(-100.0,100.0,-100.0/k,100.0/k,1.0,-1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main()
{
glutInitDisplayMode(GLUT_RGBA|GL_DOUBLE);
glutCreateWindow(" Redeeculous :( ");
glutReshapeFunc(Change);
glutDisplayFunc(Render);
glClearColor(0.0,0.0,0.0,0.0);
glDrawBuffer(GL_LEFT);
glutMainLoop();
}


I specify the command glDrawBuffer(GL_LEFT);
I wanna render it in GL_LEFT Color Buffer ,I didnt render it to GL_BACK
color buffer .why can I still see the green square ??, I thought It must be Black screen

3. How to know that how many GL_AUX color buffer we have ?? ,The book doesnt tell me

--------------
THanks for interested in :p









Share this post


Link to post
Share on other sites
why my post get push down to page 2nd :D , this magic will bring it up to 1st page what happen???:p

[Edited by - Love3DGraphiks on May 10, 2006 1:20:22 PM]

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!