Beginners Tutorials

Started by imnotanerd, December 12, 2010, 05:20:17

Previous topic - Next topic

imnotanerd

I am concerned about the lack of tutorials for beginners to LWJGL. Sure you could use the demo's source code for inspiration, but to me, that's just spitting out code for you to understand. And i don't. Sure, i may know Java, but the API calls i don't. Are there plans to make tutorials from beginners to advanced for newcomers to LWJGL?
I once said hi to someone. He punched me back.

jediTofu

http://lwjgl.org/wiki/index.php?title=Main_Page

The home page just needs to be updated and more tutorials are being worked on.
There will be more LWJGL-specific tutorials soon.
cool story, bro

mstWeal

What are the things missing that you would want a tutorial for? Of course, more tutorials would always be better but I think there are enough to get you started. You cannot expect a complete introduction into the OpenGL API but there are good books. Specifically good is the red book, also available online http://fly.cc.fer.hr/~unreal/theredbook/ .. or the OpenGL Suberbible.

CodeBunny

One thing I would find very helpful would be a FBO tutorial. I've been able to find tutorials for creating one in OpenGL, but I haven't found any such thing for the LWJGL API.

kappa

Quote from: CodeBunny on January 08, 2011, 20:59:14
One thing I would find very helpful would be a FBO tutorial. I've been able to find tutorials for creating one in OpenGL, but I haven't found any such thing for the LWJGL API.

added to the wiki just for you http://lwjgl.org/wiki/index.php?title=Using_Frame_Buffer_Objects_(FBO) :)

The tutorial is now a little old and is actually from the old lwjgl wiki that was lost when the server crashed. FBO's are no longer new (as stated in the tutorial) and are now available as part of standard OpenGL (so available as both extension and GL30). The tutorial should lay down the basics so pretty easy to switch between extension version and OpenGL version.

Feel free to update the tutorial and fix it as required.

CodeBunny

Sweet, thank you very much. :)

kappa

Resurrected the last useful and salvageable bits from the old wiki, the two VBO tutorials, now amalgamated into one VBO tutorial.

http://lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_(VBO)

Again slightly out of date (as VBO's are now also part of core opengl) but useful none the less, so if you use it, please free to update it.

CodeBunny

So I've gotten a FBO working, and can render to textures I've loaded on command. However, the results of rendering to the textures are skewed and are improperly sized. I think it's because of

GL11.glPushAttrib(GL11.GL_VIEWPORT_BIT);
GL11.glViewport(0, 0, texture.getImageWidth(), texture.getImageHeight());


getImage(Height/Width) returns the dimension of the image placed on a particular texture (via slick-util).

I then draw other textures/shapes on it similarly to how the FBO tutorial illustrates.

What's going on? My game is 2D and in orthogonal mode, is this somehow interfering?

avm1979

The same orthogonal transformation you've already specified is determining how the stuff gets drawn to the FBO.  Since your new viewport has a different size/aspect ratio than the previous one, stuff gets stretched/scaled.

You'll want to set a new ortho transform, probably something like

GL11.glPushMatrix();
GL11.glOrtho(0, texture.getImageWidth(), 0, texture.getImageHeight(), -1000, 1000);
... draw stuff ...
GL11.glPopMatrix();

CodeBunny

I see what you mean, but I haven't been able to make glOrtho work...

Here's my code:

public static boolean beginDrawingTo(Texture texture)
	{
		if(GLContext.getCapabilities().GL_EXT_framebuffer_object)
		{
			IntBuffer buffer = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer();
			EXTFramebufferObject.glGenFramebuffersEXT(buffer);
			frameBuffersActive.push(buffer.get());
			
			EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffersActive.peek());
			EXTFramebufferObject.glFramebufferTexture2DEXT( EXTFramebufferObject.GL_FRAMEBUFFER_EXT,
					EXTFramebufferObject.GL_COLOR_ATTACHMENT0_EXT, GL11.GL_TEXTURE_2D, texture.getTextureID(), 0);

			checkFBO(frameBuffersActive.peek());	// Allows interrupting one render to texture with another, when that one is done it returns to the previous.
			

			// This is what has been giving me trouble.
			GL11.glPushAttrib(GL11.GL_VIEWPORT_BIT);
			GL11.glViewport(0, 0, texture.getImageWidth(), texture.getImageHeight());

			GL11.glTranslatef(texture.getImageWidth() / 2, texture.getImageHeight() / 2, 0); //Draw from center of image
			
			return true;
		}
		return false;
	}


Where should I put the glOrtho call and what should I set it to?

avm1979

Quote
Where should I put the glOrtho call and what should I set it to?

Set it to what I put in the previous post (i.e., the size of the FBO).  Doesn't exactly matter where you put it, as long as you set it before rendering to the FBO, and glPopMatrix() after.  After your glViewport call is as good a place as any.

CodeBunny

Okay, everything is working now. Thanks!



However, I do have one remaining question. Basically, when I begin drawing to a texture, the starting point for the draw commands is offset in the Y direction, always, and by a predictable amount.

This is my code to start rendering to a texture:

public static boolean beginDrawingTo(Texture texture)
	{
		if(renderToTextureEnabled())
		{
			IntBuffer buffer = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer();
			EXTFramebufferObject.glGenFramebuffersEXT(buffer);
			frameBuffersActive.push(buffer.get());
			
			EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT,
					frameBuffersActive.peek());
			EXTFramebufferObject.glFramebufferTexture2DEXT( EXTFramebufferObject.GL_FRAMEBUFFER_EXT,
					EXTFramebufferObject.GL_COLOR_ATTACHMENT0_EXT, GL11.GL_TEXTURE_2D, texture.getTextureID(), 0);

			checkFBO(frameBuffersActive.peek());

			GL11.glPushMatrix();
			GL11.glOrtho(0, texture.getImageWidth(), 0,-texture.getImageHeight(),  -1, 1);
			
			GL11.glLoadIdentity();
			GL11.glTranslated(texture.getImageWidth() / 2, texture.getImageHeight() / 2, 0);
			GL11.glScalef(1f, -1f, 1f);
			
			return true;
		}
		return false;
	}


If I place
GL11.glTranslated(0, WindowManager.getScreenHeight() - texture.getImageHeight(), 0);

right after glLoadIdentity(), everything works.

Why is this the case? I'm happy it's working, but a little confused.

avm1979

You're welcome, glad you got it working.

The reason for the behavior you're seeing is, in your glOrtho call, you're passing in a negative value for the height.  That causes it to flip the direction of the y-axis, and makes 0,0 the upper left corner of the viewport.  But glViewport's x,y parameters are the lower left corner of the viewport.

Then you're doing GL11.glScalef(1f, -1f, 1f) to flip the y-axis back to normal.

I'd suggest you remove the glScalef call and make the height param to glOrtho positive - that should fix it, unless something else is going on on top of this.

CodeBunny

Well, I'm making a 2D game engine, and decided that the spatial coordinates should be similar to Java2D - y+ is down the screen. This render-to-texture code is meant to be an option for a developer, where they can use the in-place rendering methods to paint to a texture.

I guess I can leave it as it is, since it's simply a scaling difference and adjusting it would either make the API more awkward or require some heavy-duty restructuring.

Thank you for all the help! :D

avm1979

Ah, gotcha.  I guess it depends on how much code you have written, but if it's not *too* much, I'd recommend switching to the standard GL way.  I started out along the same lines (flipping the y-axis, 0,0 top left) and eventually it just got to be too painful as things got more complex and I wanted to take advantage of more GL features.  Haven't looked back since.

Best of luck to you!