LWJGL Forum

Programming => Lightweight Java Gaming Library => Topic started by: Klinenator on November 08, 2010, 02:54:57

Title: Texture blending
Post by: Klinenator on November 08, 2010, 02:54:57
Im loading textures using slick with this code

selectedTex = TextureLoader.getTexture("PNG",new FileInputStream("/Users/klinenator/Documents/CubeTest/Textures/Selected.png"),GL_NEAREST);

and then later

selectedTex.bind()

how do i blend two textures together so i can have a grass texture then a light color mask over it that will make the grass texture look lighter/darker
Title: Re: Texture blending
Post by: jediTofu on November 08, 2010, 03:32:02
//In your OpenGL set up:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

//Store these variables somewhere:

double red = 1.0; //optionally lower red, green, blue if you want to remove them from texture slightly/fully
double green = 1.0;
double blue = 1.0;
double alpha = 1.0; //1.0 = visible; 0.0 = transparent; 0.5 = half translucent, etc.

//When you draw your texture:

texture.bind();
glColor4d(red,green,blue,alpha); //glColor3f(...) for floats
glBegin(GL_QUADS);
//etc.
glEnd();
Title: Re: Texture blending
Post by: Klinenator on November 08, 2010, 14:26:14
Thank you thats one of the things i wanted to do. How do i make two textures show up on one cube

I have a cube and its grey like stone then i want to overlay some crack marks in it. So i want one texture of just the stone then another of an alpha mask i guess that is just the cracks in the stone
Title: Re: Texture blending
Post by: jediTofu on November 08, 2010, 17:18:04
No prob.  I'd assume that you would just draw the cube again but with the different texture:

tex1.bind();
glColor4d(1.0,1.0,1.0,1.0);
glBegin(GL_QUADS);
//...
glEnd(GL_QUADS);

tex2.bind();
glColor4d(1.0,1.0,1.0,0.45);
glBegin(GL_QUADS);
//...
glEnd(GL_QUADS);


Not sure if this is the best way, but worked for me.
You might want to store drawing a cube in an OpenGL display list for speed.  There's some code examples of using a display list on the forums and of course google.
Title: Re: Texture blending
Post by: jediTofu on November 08, 2010, 17:19:54
Also, you might consider drawing the crack marks with OpenGL pixel/line functions instead of using an image...
Title: Re: Texture blending
Post by: Klinenator on November 08, 2010, 17:40:40
Well i want to use it for a bunch of things. Like instead of animating cracks in the cube over time just change the images from 1-10 1 =less cracked 10= more cracked

or for lighting no overlay = bright darker overlay makes the cube darker and darker as time goes on
Title: Re: Texture blending
Post by: Klinenator on November 08, 2010, 17:40:59
Might not be the best way but it seems the simplest way
Title: Re: Texture blending
Post by: Klinenator on November 08, 2010, 17:42:58
Also i do store them in glCallLists

i initialize the cube in a call list then call it later in the draw function like this

                                treeTex.bind();
                          glCallList(cubeSide);
                          treeTopTex.bind();
                          glCallList(cubeTop);
                          glTranslatef(0,1,0);

this makes a cube with a different texture on the top then moves down one unit and i draw it all over again
Title: Re: Texture blending
Post by: Klinenator on November 08, 2010, 23:08:09
With your method arent you technically drawing two cubes for every cube?
Title: Re: Texture blending
Post by: jediTofu on November 08, 2010, 23:28:07
Quote from: Klinenator on November 08, 2010, 23:08:09
With your method arent you technically drawing two cubes for every cube?

Yes, but not sure of another alternative, maybe someone will come along and give a more adequate answer.  You could also use Pbuffers or FBOs...you'd basically be drawing the 2 cubes onto a pbuffer or FBO and then drawing that to the display.
Title: Re: Texture blending
Post by: jediTofu on November 08, 2010, 23:48:44
I found this while googling  ;)

http://opengl-doc.com/Sams-OpenGL.SuperBible.Third/0672326019/ch09lev1sec5.html

The only thing is that hardware may not support multitextures (or pbuffers or fbo's for that matter, for my other suggestion).
Title: Re: Texture blending
Post by: Klinenator on November 09, 2010, 03:16:20
If i use an overlay for lighting id have to do it for every cube im not sure but i think it would slow it down drastically to have to draw twice as many cubes. I could be 100% wrong though
Title: Re: Texture blending
Post by: jediTofu on November 09, 2010, 05:15:12
Quote from: Klinenator on November 09, 2010, 03:16:20
If i use an overlay for lighting id have to do it for every cube im not sure but i think it would slow it down drastically to have to draw twice as many cubes. I could be 100% wrong though

What about multitextures in the link I provided above?
Title: Re: Texture blending
Post by: Klinenator on November 09, 2010, 13:59:18
Ill have to try and convert that so i can use slick with it
Title: Re: Texture blending
Post by: Klinenator on November 09, 2010, 23:17:52
I bind a texture then draw a cube then i want to draw something else after that with just a color and not a texture but it puts the last texture that was bound onto that object

example

dirtTex.bind();
glCallList(cubeSide);
grassTex.bind();
glCallList(cubeTop);
glCallList(cubeBottom);

that last section would also have the grass texture
Title: Re: Texture blending
Post by: jediTofu on November 09, 2010, 23:39:42
Since you're using Slick-Util, you can just do this:

TextureImpl.bindNone();
Title: Re: Texture blending
Post by: Klinenator on November 10, 2010, 00:16:39
Thank you again. Maybe i should just have you build this game instead haha
Title: Re: Texture blending
Post by: Klinenator on November 10, 2010, 00:52:19
Someone should probably name this my random questions thread because thats what its turning into.

I have a 50X50X50 area right now. I want to make a sky. should i just make a box thats 50X50X50 and texture the inside as starts or whatever? Im thinking of making it a blueish color then as it gets darker add a darker texture on top of the blue until it eventually gets black then also add  a starts texture