• Advertisement
Sign in to follow this  

OpenGL Opengl placement of statements

This topic is 3697 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

HELP!!!! I am used to ALLEGRO and i dont know where to place statements like l=l+1 and so on. here is my code. the line in question is marked by <----HERE-- #include <windows.h> #include <gl\gl.h> #include <gl\glut.h> #include <gl\glu.h> /* GLU extention library */ void init(void); void display(void); void keyboard(unsigned char, int, int); void resize(int, int); void drawcube(int, int, int); int is_depth; /* depth testing flag */ int l; int main (int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(600, 600); glutInitWindowPosition(40, 40); glutCreateWindow("The Cube World"); init(); glutDisplayFunc(display); glutKeyboardFunc(keyboard); l=-3; /* this time we're going to keep the aspect ratio constant by trapping the window resizes */ glutReshapeFunc(resize); glutMainLoop(); return 0; } void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); is_depth = 1; glMatrixMode(GL_MODELVIEW); } void display(void) { if (is_depth) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); else glClear(GL_COLOR_BUFFER_BIT); /* draw the floor */ glBegin(GL_QUADS); glColor3f(0.2f, 0.2f, 0.2f); glVertex3f(-100.0, 0.0, -100.0); glColor3f(0.4f, 0.4f, 0.4f); glVertex3f(-100.0, 0.0, 100.0); glColor3f(0.6f, 0.6f, 0.6f); glVertex3f(100.0, 0.0, 100.0); glColor3f(0.8f, 0.8f, 0.8f); glVertex3f(100.0, 0.0, -100.0); glEnd(); /* draw 12 cubes with different colors */ //drawcube(75, 57, 2); //drawcube(-65, -12, 3); //drawcube(50, -50, 1); //drawcube(-56, 17, 2); //drawcube(67, 12, 3); //drawcube(-87, 32, 1); //drawcube(-26, 75, 2); //drawcube(57, 82, 3); drawcube(l, 12, 1); //drawcube(46, 35, 2); //drawcube(37, -2, 3); glutSwapBuffers(); } void keyboard(unsigned char key, int x, int y) {l=l+1; /////////////////////////////<-----------------HERE---- /* This time the controls are: "a": move left "d": move right "w": move forward "s": move back "t": toggle depth-testing */ switch (key) { case 'a': case 'A': glTranslatef(5.0, 0.0, 0.0); break; case 'd': case 'D': glTranslatef(-5.0, 0.0, 0.0); break; case 'w': case 'W': glTranslatef(0.0, 0.0, 5.0); break; case 's': case 'S': glTranslatef(0.0, 0.0, -5.0); break; case 'u': case 'U': glRotatef(3.0, 0.0, 1.0, 0.0); /* rotate up */ break; case 'y': case 'Y': glRotatef(-3.0, 0.0, 1.0, 0.0); /* rotate up */ break; case 't': case 'T': if (is_depth) { is_depth = 0; glDisable(GL_DEPTH_TEST); } else { is_depth = 1; glEnable(GL_DEPTH_TEST); } } display(); } void resize(int width, int height) { if (height == 0) height = 1; glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* note we divide our width by our height to get the aspect ratio */ gluPerspective(45.0, width / height, 1.0, 400.0); /* set initial position */ glTranslatef(0.0, -5.0, -150.0); glMatrixMode(GL_MODELVIEW); } void drawcube(int x_offset, int z_offset, int color) { /* this function draws a cube centerd at (x_offset, z_offset) x and z _big are the back and rightmost points, x and z _small are the front and leftmost points */ float x_big = (float)x_offset + 5; float z_big = (float)z_offset + 5; float x_small = (float)x_offset - 5; float z_small = (float)z_offset - 5; switch(color) { case 1: glColor3f(1.0,0.0,0.0); break; case 2: glColor3f(0.0,1.0,0.0); break; case 3: glColor3f(0.0,0.0,1.0); break; } glBegin(GL_QUADS); glVertex3f(x_small,10.0,z_big); /* front */ glVertex3f(x_small,0.0,z_big); glVertex3f(x_big,0.0,z_big); glVertex3f(x_big,10.0,z_big); glVertex3f(x_big,10.0,z_small); /* back */ glVertex3f(x_big,0.0,z_small); glVertex3f(x_small,0.0,z_small); glVertex3f(x_small,10.0,z_small); glVertex3f(x_big,10.0,z_big); /* right */ glVertex3f(x_big,0.0,z_big); glVertex3f(x_big,0.0,z_small); glVertex3f(x_big,10.0,z_small); glVertex3f(x_small,10.0,z_small); /* left */ glVertex3f(x_small,0.0,z_small); glVertex3f(x_small,0.0,z_big); glVertex3f(x_small,10.0,z_big); glVertex3f(x_small,10.0,z_big); /* top */ glVertex3f(x_big,10.0,z_big); glVertex3f(x_big,10.0,z_small); glVertex3f(x_small,10.0,z_small); glVertex3f(x_small,0.0,z_small); /* bottom */ glVertex3f(x_big,0.0,z_small); glVertex3f(x_big,0.0,z_big); glVertex3f(x_small,0.0,z_big); glEnd(); } it works but i have to press a button to make it work. I want it to just move across the screen automatically I tried moving it outside of the keyboard loop, but then I get an error like its not supposed to be there. It has to work if placed in the right position in the code, right????? but i dont know where opengl wants me to put it. please help someone.

Share this post


Link to post
Share on other sites
Advertisement
Of course l is only incremented when you press a key, it is in your keypress calback. Create a timer callback and place the code there instead.

Share this post


Link to post
Share on other sites
you mean like just before the key loop. something like

for(l<100)
{l=l+1;}

if that is what you mean then i have already tried this and i get an error message...."expected unqualified id"
so I don't know what to do or where to turn. I mean Opengl should be able to handle a for loop right???

Share this post


Link to post
Share on other sites
Quote:
Original post by sakares
you mean like just before the key loop. something like

for(l<100)
{l=l+1;}

if that is what you mean then i have already tried this and i get an error message...."expected unqualified id"
so I don't know what to do or where to turn. I mean Opengl should be able to handle a for loop right???


First of all, OpenGL doesn't 'handle' for loops. OpenGL is simply a set of functions that let you talk to your graphics hardware. Second, you may want to look into the proper syntax for a for loop. Third, if you do get that for loop properly set up, the object isn't going to move smoothly (its going to jump, and disappear before you see anything). This is because your program will stop until the for loop is completed, and effectively just increment l by 100.

I'm not even sure why you would need a for loop in this instance. Probably the quickest and easiest (although, not necessarily the 'best') thing to do is simply most the l=l+1 statement to the top of your display function. As I recall, GLUT allows you to set up an idle function callback. Creating one of those, as CodeMunkie suggested, and putting the code there, is probably a better way to go.

And, although the code may work, there are certainly a number of things that should be done. Among other things, you really should have a call to glLoadIdentity at the start of your display function. However, this means you'll need to make some changes to your keyboard handling. The transformations will have to be stored in some variables, and the transformations moved into the display function.

Share this post


Link to post
Share on other sites
funny I was taken literally about opengl handling a for loop...anyway, i think this is great advice and thank you for it, although I odnt know what you mean by proper syntax, my syntax for for loops has been fine in all my other c++ application, but I am no expert. anyway I moved my l=l+1 to the top of the display function an it works but i need to press a key still for my cube to move across the screen. I htink the secret may lay in this callback function, I have not been able to find an example of this would you be able to or would anyone for this matter be able to provide me an example of this and what its purpose is???

Share this post


Link to post
Share on other sites
Look up glutTimerFunc. It is very similar to the way you set up your glutDisplayFunc and glutKeyboardFunc, but it also takes in a timeout parameter that determines how often the function is called.

Share this post


Link to post
Share on other sites
Man you guys are being so nice to me helping me out I really appreciate it. i looked up the gluttimer thing and got this.

void glutTimerFunc(unsigned int msecs, void (*func)(int value), value);

how to use it this is another question. ummmm... is it a really complicated thing or would someone be able to put it in the right place for me. I just need to see things in the right place and then I can figure them out from there. so basically when I figure this out and figure out how to display variables such as l on the screen i will be set.

and which things need to be filled in??? msec i assume that I put the time that i want to elapse between loops and *func what is this??? int value also????
anyway any more help would be appreciated.

Share this post


Link to post
Share on other sites
I GOT IT!!!!!! NOW I JUST HAVE TO FIGURE OUT HOW TO DISPLAY MY VARIBALE AS A TEXT ON THE SCREEN ANY SUGESSTIONS???

Share this post


Link to post
Share on other sites
There's dozens of ways to display text on the screen. None are very easy. And I get the impression that you need to slow down. Your original question shows that you need to spend more time learning C++, rather than hopping into OpenGL. Getting a good foundation is very important, and is difficult to do if you get ahead of yourself. Write some Allegro programs totally from scratch. Don't copy a single line from any program (be it yours or a tutorial). This will help you solve problems like your first one on your own. I understand that you're excited and want to do as much as possible, but you will be able to do far more if you take it easy and make sure to get a strong understanding, rather than the bare minimum understanding, of base information.

Well, that's my take on it. Use it as you want.

Oh, and Allegro can handle OpenGL for you. This would let you learn just OpenGL instead of GLut along with OpenGL.

Share this post


Link to post
Share on other sites
actually i am pretty comfortable with c++ and have written several programs in allegro 2d games and such, its just the opengl syntax is quite different to me.but to anyone that can help me out with this it would be greatly appreciated.

Share this post


Link to post
Share on other sites
As Ezbez mentioned, text rendering in OpenGL is pretty tricky to do correctly. If you just want to put a couple of values up on the screen for kicks, you should be able to follow the font tutorials at NeHe and something working.

Share this post


Link to post
Share on other sites
Personally I think that glut is getting in your way and another startup library might be better, like SDL or SFML.

Share this post


Link to post
Share on other sites
I like the title of this thread : "Opengl placement of statements"

Share this post


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

  • Advertisement
  • Advertisement
  • Popular Tags

  • Advertisement
  • Popular Now

  • Similar Content

    • By QQemka
      Hello. I am coding a small thingy in my spare time. All i want to achieve is to load a heightmap (as the lowest possible walking terrain), some static meshes (elements of the environment) and a dynamic character (meaning i can move, collide with heightmap/static meshes and hold a varying item in a hand ). Got a bunch of questions, or rather problems i can't find solution to myself. Nearly all are deal with graphics/gpu, not the coding part. My c++ is on high enough level.
      Let's go:
      Heightmap - i obviously want it to be textured, size is hardcoded to 256x256 squares. I can't have one huge texture stretched over entire terrain cause every pixel would be enormous. Thats why i decided to use 2 specified textures. First will be a tileset consisting of 16 square tiles (u v range from 0 to 0.25 for first tile and so on) and second a 256x256 buffer with 0-15 value representing index of the tile from tileset for every heigtmap square. Problem is, how do i blend the edges nicely and make some computationally cheap changes so its not obvious there are only 16 tiles? Is it possible to generate such terrain with some existing program?
      Collisions - i want to use bounding sphere and aabb. But should i store them for a model or entity instance? Meaning i have 20 same trees spawned using the same tree model, but every entity got its own transformation (position, scale etc). Storing collision component per instance grats faster access + is precalculated and transformed (takes additional memory, but who cares?), so i stick with this, right? What should i do if object is dynamically rotated? The aabb is no longer aligned and calculating per vertex min/max everytime object rotates/scales is pretty expensive, right?
      Drawing aabb - problem similar to above (storing aabb data per instance or model). This time in my opinion per model is enough since every instance also does not have own vertex buffer but uses the shared one (so 20 trees share reference to one tree model). So rendering aabb is about taking the model's aabb, transforming with instance matrix and voila. What about aabb vertex buffer (this is more of a cosmetic question, just curious, bumped onto it in time of writing this). Is it better to make it as 8 points and index buffer (12 lines), or only 2 vertices with min/max x/y/z and having the shaders dynamically generate 6 other vertices and draw the box? Or maybe there should be just ONE 1x1x1 cube box template moved/scaled per entity?
      What if one model got a diffuse texture and a normal map, and other has only diffuse? Should i pass some bool flag to shader with that info, or just assume that my game supports only diffuse maps without fancy stuff?
      There were several more but i forgot/solved them at time of writing
      Thanks in advance
    • By RenanRR
      Hi All,
      I'm reading the tutorials from learnOpengl site (nice site) and I'm having a question on the camera (https://learnopengl.com/Getting-started/Camera).
      I always saw the camera being manipulated with the lookat, but in tutorial I saw the camera being changed through the MVP arrays, which do not seem to be camera, but rather the scene that changes:
      Vertex Shader:
      #version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec2 aTexCoord; out vec2 TexCoord; uniform mat4 model; uniform mat4 view; uniform mat4 projection; void main() { gl_Position = projection * view * model * vec4(aPos, 1.0f); TexCoord = vec2(aTexCoord.x, aTexCoord.y); } then, the matrix manipulated:
      ..... glm::mat4 projection = glm::perspective(glm::radians(fov), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f); ourShader.setMat4("projection", projection); .... glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp); ourShader.setMat4("view", view); .... model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f)); ourShader.setMat4("model", model);  
      So, some doubts:
      - Why use it like that?
      - Is it okay to manipulate the camera that way?
      -in this way, are not the vertex's positions that changes instead of the camera?
      - I need to pass MVP to all shaders of object in my scenes ?
       
      What it seems, is that the camera stands still and the scenery that changes...
      it's right?
       
       
      Thank you
       
    • By dpadam450
      Sampling a floating point texture where the alpha channel holds 4-bytes of packed data into the float. I don't know how to cast the raw memory to treat it as an integer so I can perform bit-shifting operations.

      int rgbValue = int(textureSample.w);//4 bytes of data packed as color
      // algorithm might not be correct and endianness might need switching.
      vec3 extractedData = vec3(  rgbValue & 0xFF000000,  (rgbValue << 8) & 0xFF000000, (rgbValue << 16) & 0xFF000000);
      extractedData /= 255.0f;
    • By Devashish Khandelwal
      While writing a simple renderer using OpenGL, I faced an issue with the glGetUniformLocation function. For some reason, the location is coming to be -1.
      Anyone has any idea .. what should I do?
    • By Andrey OGL_D3D
      Hi all!
      I try to use the Sun shafts effects via post process in my 3DEngine, but i have some artefacts on final image(Please see attached images).
      The effect contains the following passes:
      1) Depth scene pass;
      2) "Shafts pass" Using DepthPass Texture + RGBA BackBuffer texture.
      3) Shafts pass texture +  RGBA BackBuffer texture.
      Shafts shader for 2 pass:
      // uniform sampler2D FullSampler; // RGBA Back Buffer uniform sampler2D DepthSampler; varying vec2 tex; #ifndef saturate float saturate(float val) {     return clamp(val, 0.0, 1.0); } #endif void main(void) {     vec2 uv = tex;     float sceneDepth = texture2D(DepthSampler, uv.xy).r;     vec4  scene        = texture2D(FullSampler, tex);     float fShaftsMask     = (1.0 - sceneDepth);     gl_FragColor = vec4( scene.xyz * saturate(sceneDepth), fShaftsMask ); } final shader:
      // uniform sampler2D FullSampler; // RGBA Back Buffer uniform sampler2D BlurSampler; // shafts sampler varying vec4 Sun_pos; const vec4    ShaftParams = vec4(0.1,2.0,0.1,2.0); varying vec2 Tex_UV; #ifndef saturate  float saturate(float val) {     return clamp(val, 0.0, 1.0); } #endif vec4 blendSoftLight(vec4 a, vec4 b) {   vec4 c = 2.0 * a * b + a * a * (1.0 - 2.0 * b);   vec4 d = sqrt(a) * (2.0 * b - 1.0) + 2.0 * a * (1.0 - b);       // TODO: To look in Crysis what it the shit???   //return ( b < 0.5 )? c : d;   return any(lessThan(b, vec4(0.5,0.5,0.5,0.5)))? c : d; } void main(void) {     vec4 sun_pos = Sun_pos;     vec2    sunPosProj = sun_pos.xy;     //float    sign = sun_pos.w;     float    sign = 1.0;     vec2    sunVec = sunPosProj.xy - (Tex_UV.xy - vec2(0.5, 0.5));     float    sunDist = saturate(sign) * saturate( 1.0 - saturate(length(sunVec) * ShaftParams.y ));     sunVec *= ShaftParams.x * sign;     vec4 accum;     vec2 tc = Tex_UV.xy;     tc += sunVec;     accum = texture2D(BlurSampler, tc);     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.875;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.75;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.625;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.5;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.375;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.25;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.125;     accum  *= 0.25 * vec4(sunDist, sunDist, sunDist, 1.0);           accum.w += 1.0 - saturate(saturate(sign * 0.1 + 0.9));     vec4    cScreen = texture2D(FullSampler, Tex_UV.xy);           vec4    cSunShafts = accum;     float fShaftsMask = saturate(1.00001 - cSunShafts.w) * ShaftParams.z * 2.0;              float fBlend = cSunShafts.w;     vec4 sunColor = vec4(0.9, 0.8, 0.6, 1.0);     accum =  cScreen + cSunShafts.xyzz * ShaftParams.w * sunColor * (1.0 - cScreen);     accum = blendSoftLight(accum, sunColor * fShaftsMask * 0.5 + 0.5);     gl_FragColor = accum; } Demo project:
      Demo Project
      Shaders for postprocess Shaders/SunShaft/
      What i do wrong ?
      Thanks!
       


  • Advertisement