Code archives/3D Graphics - Misc/(Blitz3dSDK) Combine alpha textures

This code has been declared by its author to be Public Domain code.

Download source code

(Blitz3dSDK) Combine alpha textures by JesseJoh2013
This is a function to combine multiple textures together. Much faster to do this at game load and use a single texture than it is to use hardware multi-texturing
Function add_texture_to_texture(destination_texture, add_texture)
	
	Local texture_width = bbTextureHeight(add_texture)
	Local texture_height = bbTextureWidth(add_texture)
	
	texture_width = texture_width - 1
	texture_height = texture_height - 1
	
	bbLockBuffer(bbTextureBuffer(destination_texture))
	bbLockBuffer(bbTextureBuffer(add_texture))
	
	For Local y = 0 To texture_width
		For Local x = 0 To texture_height
		
			
			Local rgba_value_src = bbReadPixelfast(x, y, bbTextureBuffer(add_texture))
			
			Local a_src = (rgba_value_src Shr 24) & $FF
			Local r_src = (rgba_value_src Shr 16) & $FF
			Local g_src = (rgba_value_src Shr 8) & $FF
			Local b_src = rgba_value_src & $FF
			
			If a_src = 0 Then Continue
			
			Local masking_factor:Float = Float(a_src) / Float(255)
			
			
			Local rgba_value_dest = bbReadPixel(x, y, bbTextureBuffer(destination_texture))
			
			Local a_dest = (rgba_value_dest Shr 24) & $FF
			Local r_dest = (rgba_value_dest Shr 16) & $FF
			Local g_dest = (rgba_value_dest Shr 8) & $FF
			Local b_dest = rgba_value_dest & $FF
			
			Local new_a = a_dest * (1 - masking_factor) + a_src * masking_factor
			Local new_r = r_dest * (1 - masking_factor) + r_src * masking_factor
			Local new_g = g_dest * (1 - masking_factor) + g_src * masking_factor
			Local new_b = b_dest * (1 - masking_factor) + b_src * masking_factor
			
			
			Local new_rgba = (new_a Shl 24 | new_r Shl 16 | new_g Shl 8 | new_b)
			
			bbWritePixelFast(x, y, new_rgba, bbTextureBuffer(destination_texture))
			bbBufferDirty(bbTextureBuffer(destination_texture))
		Next
	Next
	
	bbUnlockBuffer(bbTextureBuffer(add_texture))
	bbUnlockBuffer(bbTextureBuffer(destination_texture))

End Function

Comments

Guy Fawkes2013
Converted to Blitzbasic:

Function add_texture_to_texture(destination_texture, add_texture)
	
	Local texture_width = TextureHeight(add_texture)
	Local texture_height = TextureWidth(add_texture)
	
	texture_width = texture_width - 1
	texture_height = texture_height - 1
	
	LockBuffer(TextureBuffer(destination_texture))
	LockBuffer(TextureBuffer(add_texture))
	
	For y = 0 To texture_width
		For x = 0 To texture_height
		
			
			Local rgba_value_src = ReadPixelFast(x, y, TextureBuffer(add_texture))
			
			Local a_src = (rgba_value_src Shr 24) And $FF
			Local r_src = (rgba_value_src Shr 16) And $FF
			Local g_src = (rgba_value_src Shr 8) And $FF
			Local b_src = rgba_value_src And $FF
			
			If a_src = 0 Then Exit
			
			Local masking_factor# = Float(a_src) / Float(255)
			
			
			Local rgba_value_dest = ReadPixel(x, y, TextureBuffer(destination_texture))
			
			Local a_dest = (rgba_value_dest Shr 24) And $FF
			Local r_dest = (rgba_value_dest Shr 16) And $FF
			Local g_dest = (rgba_value_dest Shr 8) And $FF
			Local b_dest = rgba_value_dest And $FF
			
			Local new_a = a_dest * (1 - masking_factor) + a_src * masking_factor
			Local new_r = r_dest * (1 - masking_factor) + r_src * masking_factor
			Local new_g = g_dest * (1 - masking_factor) + g_src * masking_factor
			Local new_b = b_dest * (1 - masking_factor) + b_src * masking_factor
			
			
			Local new_rgba = (new_a Shl 24 Or new_r Shl 16 Or new_g Shl 8 Or new_b)
			
			WritePixelFast(x, y, new_rgba, TextureBuffer(destination_texture))
			BufferDirty(TextureBuffer(destination_texture))
		Next
	Next
	
	UnlockBuffer(TextureBuffer(add_texture))
	UnlockBuffer(TextureBuffer(destination_texture))

End Function



Code Archives Forum