• Advertisement
Sign in to follow this  

OpenGL Creating an infinite grid in OpenGL 2.1

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

Hello everyone,

 

I am very new to coding with Opengl. I am currently creating a view where it is an infinte grid. At least, infinte in the the sense that everytime the user pans, the view will update to show the grid.

 

For the first version, I was thinking that I would have dots to indicate the grid markings. I have some code but I am not sure what is precisely wrong with it. Maybe I am thinking about it the wrong way.

 

What should be happening is that when the code is executed, dots indicating the grid markings will appear. The idea is that everytime the user pans across the scene, the program will redraw the dots

void geometryEditorCanvas::drawGrid()
{
	// Clears the color buffer
//	glClear(GL_COLOR_BUFFER_BIT);
	
	//Reset to modelview matrix
//	glMatrixMode(GL_MODELVIEW);
//	glPopMatrix();
	
	for(double i = 0; i < factor; i++)
	{
		for(double j = 0; j < factor; j++)
		{
			glBegin(GL_POINT);
			glColor3d(0.0d, 0.0d, 0.0d);
				glVertex2d(j * coordinateFactorWidth, i * coordinateFactorHeight);
			glEnd();
		}
	}
}



void geometryEditorCanvas::onGeometryPaint(wxPaintEvent &event)
{
	wxGLCanvas::SetCurrent(*geometryContext);// This will make sure the the openGL commands are routed to the wxGLCanvas object
	wxPaintDC dc(this);// This is required for drawing
	
	render();
	
	drawGrid();
	glFlush();
	SwapBuffers();// Display the output
}

For those wondering, I am developing a 2D scene and the UI library that I am using is wxWidgets. If you need more of the code please let me know, thank you

Edited by philm001

Share this post


Link to post
Share on other sites
Advertisement

You say "I am not sure what is precisely wrong" but you're not describing what's going on here at all.

 

What are you expecting to happen?  What's not happening?  You really need to describe your problem a lot better - help us to help you!

Share this post


Link to post
Share on other sites

So.. does it not work?

If there are any dots displayed at all, post a screenshot.

If not, post the initialization of "factor" and "coordinateFactorWidth/Height" variables, as well as your matrices.

You can start troubleshooting with glLoadIdentity() for both projection and modelview, which should at least show one single dot in the center, as long as factor > 0. Once you see a dot it should just be a matter of getting the matrices and scaling right to draw a grid.

Share this post


Link to post
Share on other sites

No, it does not work. Factor is a constant number which tells me how many coordinate markings there should be in the default view for both x and y.

 

here is the coordinateFactorHeight/Width initilization:

coordinateFactorWidth = canvasWidth / (double)factor;
coordinateFactorHeight = canvasHeight / (double)factor;

Share this post


Link to post
Share on other sites

So factor is some number, canvasWidth is some number, and coordinateFactorWidth is some number divided by some other number.
The running theme here is that you keep not providing enough information for anyone to do anything but ask for more information.
Would it be so hard to provide the equation, and then say, “factor is 10, canvasWidth is 800”?
 
Did you try ::glLoadIdentity() as you were told to do?  If you are calling render() before drawGrid() it is fairly likely that the matrices are set to something strange.
Did you disable depth testing?
Are the dots a different color from the clear/background color?
Are the dots too close to the camera and being culled?  Why not push the dots back a unit?
How big are the dots?  Are you sure they are at least a pixel large?
Is coordinateFactorWidth an integer?  Is it rounding down to 0?
Did you set an orthographic projection matrix?
The first thing geometryEditorCanvas::drawGrid() should be doing is setting the model and view matrices to identity and setting an orthographic projection matrix.
 

glColor3d(0.0d, 0.0d, 0.0d);

This is not valid code. 0.0d = compiler error. If you want to type a constant double literal, use 0.0.
This suggests very clearly that this is not your actual code.
If you want help, post your exact actual code.
 
 
L. Spiro

Edited by L. Spiro

Share this post


Link to post
Share on other sites

 

No, it does not work.

 

This means: nothing draws?

 

One thing you should do is always set back to the identity when drawing the grid.

 

    //Reset to modelview matrix
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();

Share this post


Link to post
Share on other sites
glColor3d(0.0d, 0.0d, 0.0d);
This is not valid code. 0.0d = compiler error. If you want to type a constant double literal, use 0.0.
This suggests very clearly that this is not your actual code.
If you want help, post your exact actual code.

 

On the same theme, "glBegin (GL_POINT)" is also not valid code, and will also produce a compiler error.

Share this post


Link to post
Share on other sites

Yes, and some off-topic advice from a beginner like you, who made the same mistake one month ago. Don't start with old OpenGL!!!

1. First, all the matrix transformations are done using high-level functions, and you just use them like a monkey and you barely even know how 3d stuff works.

 

2. Literally NONE of what you learn will help you, all your code is rubbish.

 

3.  In my previous posts, Bregma said that the code is rubbish, but what you learn and the knowledge you get is not rubbish.   I say: That is rubbish, too!! ( or the slowest possible way of learning openGL )

 

4. Better get the proper math book first, so you can have a good vector background, and then you will be able to make all the matrixes on your own, or even better, use GLM.

(GLM is header only, copy/paste the stuff from the "include" are you are ready to go )

 

5. There was a university lecturer in my last post who said that the learning curve of new programmable pipeline( OpenGL 3.3+) is impossibly big for a beginner to understand and that he taught his students to use old openGL in the first year, and programmable pipeline in the next year. I'm a student and I say: What a waste of time!!!  

 

My opinion: Better download a sample starter program for OpenGL 3.3+ from some tutorial, ignore the vertex and fragment shader files in the beginning, buy 2-3 books for Opengl 4.3 and use them for reference ( read and practice simultaneously ), go through all the functions, learn what they do, experiment, change, enjoy, and when you are ready, return to shaders, and trust me, it's not complicated at all once you get it.

 

6. You will learn really bad habits with old OpenGL, and even the shading language you will learn in the old books is deprecated. And most of the books make a whole fat chapter ( 100 or more pages ) only to display lists and other deprecated stuff, which is kind of outdated, too, at least from what I see.

 

All of this is just a beginner's advice, don't take it seriously if you don't feel like trusting me, I can't help someone who doesn't want to be helped, sry.
But if you do: 1 more advice from me. When you start a book, don't read all the pages, just read what you need, use it for reference, and practice a lot. If you read 800 pages at once you are going to get frustrated by all of the material and give up.

Edited by Heelp

Share this post


Link to post
Share on other sites

Hello all,

 

thank you for your patience and your replies. I can see that my posts are very unclear. I am a little frustrated at the code and the pressure to get things working was amounting. I very apologize to the community and I hope that you all can forgive. 

 

If I may, please let me try again on a clean slate.

 

I am attempting to create a 2D CAD editor with some very basic functions to draw shapes take measurements, etc. I will not be using shaders since everything is literally going to be black and white. I know that the older versions of opengl have a number of shortcomings but since I will not be using the majority of the featurs, I figured I could get aaway with using an older version. I was also hoping that the older version would be "simplier". I am also looking for a very wide range of device support so I went with GL 2.1 (I heard that 1.1 is a very bad idea so 2.1 seemed to suffice). This CAD editor will be used in a finite Element simulator (Just to give you some context of where I am going). Thankfully, I am not going to be getting into 3D at this time and I am sticking to only 2D.

 

Below is the infinite grid space. I hope that someone will find this beneficial later on. Although, I am still very new to openGL programming and this was found on a basis of guess and check. So I do have some questions on why something work.

void geometryEditorCanvas::drawGrid()
{
	//Reset to modelview matrix
	glMatrixMode(GL_MODELVIEW);
	glPopMatrix();
	glPushMatrix();
	glTranslatef(canvasWidth / 2.0f - (float)cameraX, canvasHeight / 2.0f - (float)cameraY, 0.0f);
	for(double i = 0; i < factor; i++)
	{
		for(double j = 0; j < factor; j++)
		{
			glBegin(GL_POINTS);
				glColor3d(0.0d, 0.0d, 0.0d);
				glVertex2d((j * coordinateFactorWidth - canvasWidth / 2.0d ), (i * coordinateFactorHeight - canvasHeight / 2.0d));
			glEnd();
		}
	}
}

In the function, I am selecting the model view matrix, then I am popping and pushing a matrix to the stack. I am kinda of borrowing code from an example and when they were drawing, they were poping and pushing the matrix as such. The author did not go into great detail but what is the purpose of doing this? (Also, if you see any issues with my terminology or my interpretation of anything, please point it out and correct me so that I can make sure that my understanding is correct)

 

Continuing on, I set the view matrix to the center of the screen (I think that what this is happening is that I am actually setting the eniter model to the center of the screen). Now we go into the whole double for loop. My idea is that one loop controls the marking for the x-axis and the other controls the markings for the y-axis. CoordinateFactorWidth is a number which describes the number of pixels between grid markings and factor is a number controlling the number of grid markings that the user will see. The glColor3d(0.0d, 0.0d, 0.0d) is crucial because this will set the points to be black (yes, this compiles and this is legit. At least, it compiles on my linux machine).

 

CameraX and CameraY is a variable which describes the number of pixels that the model is shifted by. The code for this is found below:

void geometryEditorCanvas::onKeyDown(wxKeyEvent &event)
{
    if(event.GetKeyCode() == LETTER_W || event.GetKeyCode() == LETTER_w)
    {
        cameraY -= 16.0f;
    }
	else if(event.GetKeyCode() == LETTER_S || event.GetKeyCode() == LETTER_s)
	{
		cameraY += 16.0f;
	}	
	else if(event.GetKeyCode() == LETTER_A || event.GetKeyCode() == LETTER_a)
	{
		cameraX -= 16.0f;
	}
	else if(event.GetKeyCode() == LETTER_d || event.GetKeyCode() == LETTER_D)
	{	
		cameraX += 16.0f;
	}
    
	glMatrixMode(GL_MODELVIEW);
	glPopMatrix();
	glLoadIdentity();
	
	glTranslated(cameraX, cameraY, 0.0f);
	glPushMatrix();
	
    this->Refresh();// This will force the canvas to experience a redraw event
}

And for those curious, yes, this is my own code that I handwritten. Some parts, I saw they were doing in the tutorial which I emulated but, I do not have much understanding why they did as such.

 

Above, I have an initialize routine which is setting the projection by glOrtho.

 

Overall, I am wondering, using openGL 2.1, is there a better method of doing this from what i have? What improvements do you see that I can implement? (improvements could be it is more efficient or the code could be structured better, etc.

Edited by philm001

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 reenigne
      For those that don't know me. I am the individual who's two videos are listed here under setup for https://wiki.libsdl.org/Tutorials
      I also run grhmedia.com where I host the projects and code for the tutorials I have online.
      Recently, I received a notice from youtube they will be implementing their new policy in protecting video content as of which I won't be monetized till I meat there required number of viewers and views each month.

      Frankly, I'm pretty sick of youtube. I put up a video and someone else learns from it and puts up another video and because of the way youtube does their placement they end up with more views.
      Even guys that clearly post false information such as one individual who said GLEW 2.0 was broken because he didn't know how to compile it. He in short didn't know how to modify the script he used because he didn't understand make files and how the requirements of the compiler and library changes needed some different flags.

      At the end of the month when they implement this I will take down the content and host on my own server purely and it will be a paid system and or patreon. 

      I get my videos may be a bit dry, I generally figure people are there to learn how to do something and I rather not waste their time. 
      I used to also help people for free even those coming from the other videos. That won't be the case any more. I used to just take anyone emails and work with them my email is posted on the site.

      I don't expect to get the required number of subscribers in that time or increased views. Even if I did well it wouldn't take care of each reoccurring month.
      I figure this is simpler and I don't plan on putting some sort of exorbitant fee for a monthly subscription or the like.
      I was thinking on the lines of a few dollars 1,2, and 3 and the larger subscription gets you assistance with the content in the tutorials if needed that month.
      Maybe another fee if it is related but not directly in the content. 
      The fees would serve to cut down on the number of people who ask for help and maybe encourage some of the people to actually pay attention to what is said rather than do their own thing. That actually turns out to be 90% of the issues. I spent 6 hours helping one individual last week I must have asked him 20 times did you do exactly like I said in the video even pointed directly to the section. When he finally sent me a copy of the what he entered I knew then and there he had not. I circled it and I pointed out that wasn't what I said to do in the video. I didn't tell him what was wrong and how I knew that way he would go back and actually follow what it said to do. He then reported it worked. Yea, no kidding following directions works. But hey isn't alone and well its part of the learning process.

      So the point of this isn't to be a gripe session. I'm just looking for a bit of feed back. Do you think the fees are unreasonable?
      Should I keep the youtube channel and do just the fees with patreon or do you think locking the content to my site and require a subscription is an idea.

      I'm just looking at the fact it is unrealistic to think youtube/google will actually get stuff right or that youtube viewers will actually bother to start looking for more accurate videos. 
    • By Balma Alparisi
      i got error 1282 in my code.
      sf::ContextSettings settings; settings.majorVersion = 4; settings.minorVersion = 5; settings.attributeFlags = settings.Core; sf::Window window; window.create(sf::VideoMode(1600, 900), "Texture Unit Rectangle", sf::Style::Close, settings); window.setActive(true); window.setVerticalSyncEnabled(true); glewInit(); GLuint shaderProgram = createShaderProgram("FX/Rectangle.vss", "FX/Rectangle.fss"); float vertex[] = { -0.5f,0.5f,0.0f, 0.0f,0.0f, -0.5f,-0.5f,0.0f, 0.0f,1.0f, 0.5f,0.5f,0.0f, 1.0f,0.0f, 0.5,-0.5f,0.0f, 1.0f,1.0f, }; GLuint indices[] = { 0,1,2, 1,2,3, }; GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); GLuint vbo; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertex), vertex, GL_STATIC_DRAW); GLuint ebo; glGenBuffers(1, &ebo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices,GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(float) * 5, (void*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 2, GL_FLOAT, false, sizeof(float) * 5, (void*)(sizeof(float) * 3)); glEnableVertexAttribArray(1); GLuint texture[2]; glGenTextures(2, texture); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); sf::Image* imageOne = new sf::Image; bool isImageOneLoaded = imageOne->loadFromFile("Texture/container.jpg"); if (isImageOneLoaded) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageOne->getSize().x, imageOne->getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageOne->getPixelsPtr()); glGenerateMipmap(GL_TEXTURE_2D); } delete imageOne; glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texture[1]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); sf::Image* imageTwo = new sf::Image; bool isImageTwoLoaded = imageTwo->loadFromFile("Texture/awesomeface.png"); if (isImageTwoLoaded) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageTwo->getSize().x, imageTwo->getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageTwo->getPixelsPtr()); glGenerateMipmap(GL_TEXTURE_2D); } delete imageTwo; glUniform1i(glGetUniformLocation(shaderProgram, "inTextureOne"), 0); glUniform1i(glGetUniformLocation(shaderProgram, "inTextureTwo"), 1); GLenum error = glGetError(); std::cout << error << std::endl; sf::Event event; bool isRunning = true; while (isRunning) { while (window.pollEvent(event)) { if (event.type == event.Closed) { isRunning = false; } } glClear(GL_COLOR_BUFFER_BIT); if (isImageOneLoaded && isImageTwoLoaded) { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texture[1]); glUseProgram(shaderProgram); } glBindVertexArray(vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr); glBindVertexArray(0); window.display(); } glDeleteVertexArrays(1, &vao); glDeleteBuffers(1, &vbo); glDeleteBuffers(1, &ebo); glDeleteProgram(shaderProgram); glDeleteTextures(2,texture); return 0; } and this is the vertex shader
      #version 450 core layout(location=0) in vec3 inPos; layout(location=1) in vec2 inTexCoord; out vec2 TexCoord; void main() { gl_Position=vec4(inPos,1.0); TexCoord=inTexCoord; } and the fragment shader
      #version 450 core in vec2 TexCoord; uniform sampler2D inTextureOne; uniform sampler2D inTextureTwo; out vec4 FragmentColor; void main() { FragmentColor=mix(texture(inTextureOne,TexCoord),texture(inTextureTwo,TexCoord),0.2); } I was expecting awesomeface.png on top of container.jpg

    • By khawk
      We've just released all of the source code for the NeHe OpenGL lessons on our Github page at https://github.com/gamedev-net/nehe-opengl. code - 43 total platforms, configurations, and languages are included.
      Now operated by GameDev.net, NeHe is located at http://nehe.gamedev.net where it has been a valuable resource for developers wanting to learn OpenGL and graphics programming.

      View full story
    • By TheChubu
      The Khronos™ Group, an open consortium of leading hardware and software companies, announces from the SIGGRAPH 2017 Conference the immediate public availability of the OpenGL® 4.6 specification. OpenGL 4.6 integrates the functionality of numerous ARB and EXT extensions created by Khronos members AMD, Intel, and NVIDIA into core, including the capability to ingest SPIR-V™ shaders.
      SPIR-V is a Khronos-defined standard intermediate language for parallel compute and graphics, which enables content creators to simplify their shader authoring and management pipelines while providing significant source shading language flexibility. OpenGL 4.6 adds support for ingesting SPIR-V shaders to the core specification, guaranteeing that SPIR-V shaders will be widely supported by OpenGL implementations.
      OpenGL 4.6 adds the functionality of these ARB extensions to OpenGL’s core specification:
      GL_ARB_gl_spirv and GL_ARB_spirv_extensions to standardize SPIR-V support for OpenGL GL_ARB_indirect_parameters and GL_ARB_shader_draw_parameters for reducing the CPU overhead associated with rendering batches of geometry GL_ARB_pipeline_statistics_query and GL_ARB_transform_feedback_overflow_querystandardize OpenGL support for features available in Direct3D GL_ARB_texture_filter_anisotropic (based on GL_EXT_texture_filter_anisotropic) brings previously IP encumbered functionality into OpenGL to improve the visual quality of textured scenes GL_ARB_polygon_offset_clamp (based on GL_EXT_polygon_offset_clamp) suppresses a common visual artifact known as a “light leak” associated with rendering shadows GL_ARB_shader_atomic_counter_ops and GL_ARB_shader_group_vote add shader intrinsics supported by all desktop vendors to improve functionality and performance GL_KHR_no_error reduces driver overhead by allowing the application to indicate that it expects error-free operation so errors need not be generated In addition to the above features being added to OpenGL 4.6, the following are being released as extensions:
      GL_KHR_parallel_shader_compile allows applications to launch multiple shader compile threads to improve shader compile throughput WGL_ARB_create_context_no_error and GXL_ARB_create_context_no_error allow no error contexts to be created with WGL or GLX that support the GL_KHR_no_error extension “I’m proud to announce OpenGL 4.6 as the most feature-rich version of OpenGL yet. We've brought together the most popular, widely-supported extensions into a new core specification to give OpenGL developers and end users an improved baseline feature set. This includes resolving previous intellectual property roadblocks to bringing anisotropic texture filtering and polygon offset clamping into the core specification to enable widespread implementation and usage,” said Piers Daniell, chair of the OpenGL Working Group at Khronos. “The OpenGL working group will continue to respond to market needs and work with GPU vendors to ensure OpenGL remains a viable and evolving graphics API for all its customers and users across many vital industries.“
      The OpenGL 4.6 specification can be found at https://khronos.org/registry/OpenGL/index_gl.php. The GLSL to SPIR-V compiler glslang has been updated with GLSL 4.60 support, and can be found at https://github.com/KhronosGroup/glslang.
      Sophisticated graphics applications will also benefit from a set of newly released extensions for both OpenGL and OpenGL ES to enable interoperability with Vulkan and Direct3D. These extensions are named:
      GL_EXT_memory_object GL_EXT_memory_object_fd GL_EXT_memory_object_win32 GL_EXT_semaphore GL_EXT_semaphore_fd GL_EXT_semaphore_win32 GL_EXT_win32_keyed_mutex They can be found at: https://khronos.org/registry/OpenGL/index_gl.php
      Industry Support for OpenGL 4.6
      “With OpenGL 4.6 our customers have an improved set of core features available on our full range of OpenGL 4.x capable GPUs. These features provide improved rendering quality, performance and functionality. As the graphics industry’s most popular API, we fully support OpenGL and will continue to work closely with the Khronos Group on the development of new OpenGL specifications and extensions for our customers. NVIDIA has released beta OpenGL 4.6 drivers today at https://developer.nvidia.com/opengl-driver so developers can use these new features right away,” said Bob Pette, vice president, Professional Graphics at NVIDIA.
      "OpenGL 4.6 will be the first OpenGL release where conformant open source implementations based on the Mesa project will be deliverable in a reasonable timeframe after release. The open sourcing of the OpenGL conformance test suite and ongoing work between Khronos and X.org will also allow for non-vendor led open source implementations to achieve conformance in the near future," said David Airlie, senior principal engineer at Red Hat, and developer on Mesa/X.org projects.

      View full story
    • By _OskaR
      Hi,
      I have an OpenGL application but without possibility to wite own shaders.
      I need to perform small VS modification - is possible to do it in an alternative way? Do we have apps or driver modifictions which will catch the shader sent to GPU and override it?
  • Advertisement