LWJGL
October 31, 2014, 02:01:26 *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
News: LWJGL is now using GitHub
 
   Home   Help Search Login Register  
Pages: [1] 2
  Print  
Author Topic: Beginners Tutorials  (Read 62803 times)
imnotanerd
Newbie
*
Posts: 5


Java/Ruby nerd. :D


« on: December 11, 2010, 21:20:17 »

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?
Logged

I once said hi to someone. He punched me back.
jediTofu
Prolific Timewaster
****
Posts: 280



« Reply #1 on: December 11, 2010, 22:01:43 »

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.
Logged

cool story, bro
mstWeal
Newbie
*
Posts: 20


« Reply #2 on: December 21, 2010, 12:04:27 »

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.
Logged
CodeBunny
Nerdus Imperius
*****
Posts: 562



WWW
« Reply #3 on: January 08, 2011, 12: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.
Logged
kappa
Administrator
Nerdus Imperius
*****
Posts: 1169



« Reply #4 on: January 08, 2011, 13:56:57 »

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) Smiley

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.
Logged
CodeBunny
Nerdus Imperius
*****
Posts: 562



WWW
« Reply #5 on: January 08, 2011, 13:58:01 »

Sweet, thank you very much. Smiley
Logged
kappa
Administrator
Nerdus Imperius
*****
Posts: 1169



« Reply #6 on: January 11, 2011, 02:35:51 »

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.
Logged
CodeBunny
Nerdus Imperius
*****
Posts: 562



WWW
« Reply #7 on: January 15, 2011, 09:10:24 »

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

Code:
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?
Logged
avm1979
Regular nerd
**
Posts: 96


WWW
« Reply #8 on: January 15, 2011, 13:09:41 »

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

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

CodeBunny
Nerdus Imperius
*****
Posts: 562



WWW
« Reply #9 on: January 15, 2011, 14:52:48 »

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

Here's my code:

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?
Logged
avm1979
Regular nerd
**
Posts: 96


WWW
« Reply #10 on: January 16, 2011, 07:23:17 »

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.
Logged

CodeBunny
Nerdus Imperius
*****
Posts: 562



WWW
« Reply #11 on: January 16, 2011, 12:14:02 »

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:

Code:
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
Code:
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.
Logged
avm1979
Regular nerd
**
Posts: 96


WWW
« Reply #12 on: January 16, 2011, 12:24:20 »

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.
Logged

CodeBunny
Nerdus Imperius
*****
Posts: 562



WWW
« Reply #13 on: January 16, 2011, 12:44:37 »

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! Cheesy
Logged
avm1979
Regular nerd
**
Posts: 96


WWW
« Reply #14 on: January 16, 2011, 12:51:36 »

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!
Logged

Pages: [1] 2
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2013, Simple Machines
SMFAds for Free Forums
Valid XHTML 1.0! Valid CSS!