Multitexturing/texture splatting

BlitzMax Forums/BlitzMax OpenGL Programming/Multitexturing/texture splatting

I'm trying to use a mask on an image and drawing in another to build composite map tiles.
DirectX works (tonyg's code), but in OpenGL it seems like something isn't being released/set back to normal (drawn images are always full white).

OpenGL technique:
glActiveTextureARB(GL_TEXTURE0)
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, glframe2.name)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE0)
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA)

glActiveTextureARB(GL_TEXTURE1)
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, glframe1.name)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE)
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE)
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE1)
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR)
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE1)
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR)
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS)
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA)
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_PREVIOUS)
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, GL_SRC_ALPHA)

glBegin(GL_QUADS)
	
	glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe1.u0, glframe1.v0)
	glMultiTexCoord2fARB(GL_TEXTURE1_ARB, glframe2.u0, glframe2.v0)
	glVertex2f(x, y)
	
	glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe1.u0, glframe1.v1)
	glMultiTexCoord2fARB(GL_TEXTURE1_ARB, glframe2.u0, glframe2.v1)
	glVertex2f(x + splat_image.width, y)
	
	glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe1.u1, glframe1.v1)
	glMultiTexCoord2fARB(GL_TEXTURE1_ARB, glframe2.u1, glframe2.v1)
	glVertex2f(x + splat_image.width, y + splat_image.height)
	
	glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe1.u1, glframe1.v0)
	glMultiTexCoord2fARB(GL_TEXTURE1_ARB, glframe2.u1, glframe2.v0)
	glVertex2i(x, y + splat_image.height)
	
glEnd()

glActiveTextureARB(GL_TEXTURE1_ARB)
glBindTexture(GL_TEXTURE_2D, Null)
glDisable(GL_TEXTURE_2D)

glActiveTextureARB(GL_TEXTURE0_ARB)
glBindTexture(GL_TEXTURE_2D, Null)
glDisable(GL_TEXTURE_2D)


http://www.gamedev.net/community/forums/topic.asp?topic_id=372568

Full code, binary and images (left mouse to do the splatting):
http://files.filefront.com/tilecompilatorzip/;13317692;/fileinfo.html

EDIT: Here is a shot of the problem:


EDIT2: It also seems that DirectX settings are not being unset aswell (the mask image that is drawn goes completely black; alpha is turned off?)

Alternatively, using just colors for the mask texture would be better (can invert, more easily change, etc)..

I think the default active texture ARB need to be restored after the draw.. Or something similar?

hacked around a bit with your code.

dumped the drawimage as that seemed to be the bit screwing it up and modified your splat routine to draw the base tex. Mind you I was just being a troll and I know very little about GL. but it seems to work for me, hope it helps.

SuperStrict

Framework brl.blitz

Import pub.glew
Import brl.glmax2d
Import brl.pngloader

SetGraphicsDriver(GLMax2DDriver())
Graphics(800, 600, 0)

glewInit()

Local image_grass:TImage = LoadImage("grass.png")
Local image_bricks:TImage = LoadImage("bricks.png")
Local image_mask:TImage = LoadImage("mask.png")

SetBlend(ALPHABLEND)
SetClsColor(255, 0, 255)

While KeyHit(KEY_ESCAPE) = False
	
	Cls()

	If MouseDown(1) = True
		
		dSplat(0.0, 68.0, image_grass)
		Splat(0.0, 68.0, image_bricks, image_mask)
		
		dSplat(68.0, 68.0, image_bricks)
		Splat(68.0, 68.0, image_grass, image_mask)
		
	End If
	
	Flip()
	
Wend


Function Splat(x:Float, y:Float, splat_image:TImage, mask_image:TImage)
		Local glframe1:TGLImageFrame, glframe2:TGLImageFrame
			
		glframe1 = TGLImageFrame(splat_image.Frame(0))
		glframe2 = TGLImageFrame(mask_image.Frame(0))
		
		glActiveTextureARB(GL_TEXTURE0)
		glEnable(GL_TEXTURE_2D)
		glBindTexture(GL_TEXTURE_2D, glframe2.name)
		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)
		glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE0)
		glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA)
		
		glActiveTextureARB(GL_TEXTURE1)
		glEnable(GL_TEXTURE_2D)
		glBindTexture(GL_TEXTURE_2D, glframe1.name)
		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE)
		glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE)
		glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE1)
		glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR)
		glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE1)
		glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR)
		glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS)
		glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA)
		glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_PREVIOUS)
		glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, GL_SRC_ALPHA)
			
		glBegin(GL_QUADS)
			
			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe2.u0, glframe2.v0)
			glMultiTexCoord2fARB(GL_TEXTURE1_ARB, glframe1.u0, glframe1.v0)
			glVertex2f(x, y)
				
			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe2.u0, glframe2.v1)
			glMultiTexCoord2fARB(GL_TEXTURE1_ARB, glframe1.u0, glframe1.v1)
			glVertex2f(x + splat_image.width, y)
				
			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe2.u1, glframe2.v1)
			glMultiTexCoord2fARB(GL_TEXTURE1_ARB, glframe1.u1, glframe1.v1)
			glVertex2f(x + splat_image.width, y + splat_image.height)
				
			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe2.u1, glframe2.v0)
			glMultiTexCoord2fARB(GL_TEXTURE1_ARB, glframe1.u1, glframe1.v0)
			glVertex2i(x, y + splat_image.height)
				
		glEnd()
			
		glActiveTextureARB(GL_TEXTURE1_ARB)
		glBindTexture(GL_TEXTURE_2D, Null)
		glDisable(GL_TEXTURE_2D)
			
		glActiveTextureARB(GL_TEXTURE0_ARB)
		glBindTexture(GL_TEXTURE_2D, Null)
		glDisable(GL_TEXTURE_2D)
		
End Function



Function dSplat(x:Float, y:Float, splat_image:TImage)
		Local glframe1:TGLImageFrame
			
		glframe1 = TGLImageFrame(splat_image.Frame(0))
		
		glActiveTextureARB(GL_TEXTURE0)
		glEnable(GL_TEXTURE_2D)
		glBindTexture(GL_TEXTURE_2D, glframe1.name)

			
		glBegin(GL_QUADS)
			
			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe1.u0, glframe1.v0)
			glVertex2f(x, y)
				
			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe1.u0, glframe1.v1)
			glVertex2f(x + splat_image.width, y)
				
			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe1.u1, glframe1.v1)
			glVertex2f(x + splat_image.width, y + splat_image.height)
				
			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, glframe1.u1, glframe1.v0)
			glVertex2i(x, y + splat_image.height)
				
		glEnd()
			
		glActiveTextureARB(GL_TEXTURE0_ARB)
		glBindTexture(GL_TEXTURE_2D, Null)
		glDisable(GL_TEXTURE_2D)
		
End Function