Shadows and PerPixel Lighting with Alpha Textures
BlitzMax Forums/MiniB3D Module/Shadows and PerPixel Lighting with Alpha Textures| 
 | ||
| I would like to use perpixel lighting with shadows on meshes with alpha textures. It seems when I try to apply CreateShadow using the perpixel lighting example, the alpha texture is not affected with the effect and still cast shadows. https://github.com/markcwm/openb3d.mod/blob/master/examples/sl_pixellight.bmx | 
| 
 | ||
| Can you provide a sample so I don't have to? :) | 
| 
 | ||
| Hey munch, thanks! ok here it is.. :-) that's a tree model in replacement of the teapot with the source and textures. I forgot to mention that I still have problems correctly applying textures with the per pixel lighting. | 
| 
 | ||
| Ok, I have an example for pixellight with alphamap now here. This doesn't include your media so for now it needs that supplied. I added alphamap on it's own to compare with the P key. Also I found a bug where HideEntity crashes if it is a shadow caster, need to fix that as it should work. So note I needed to load a brush and set BrushFX surf.brush to have the leaves alpha but the trunk opaque. I also use ShadeSurface so the trunk is not shadered. In the pixellight2 shader all I did was add the alphamap code and then I had to remove the light alpha value from the final color as the leaves were flickering "gl_FragColor = vec4(color.rgb * pixel.rgb, pixel.a);" And of course, stencil shadows don't work with alpha maps. | 
| 
 | ||
|  I added alphamap on it's own to compare with the P key. Also I found a bug where HideEntity crashes if it is a shadow caster, need to fix that as it should work.   This is awesome thanks! Since we're still on topic, I have a small issue in creating my own basic shaders, I tried a simple example and it works fine in a standalone glsl program where I got it from, but I when I port it to OpenB3D, the gl_Fragcolor image is always inverted. Any idea why? | 
| 
 | ||
| Maybe you're not setting a uniform. It only takes one mistake to ruin a shader. | 
| 
 | ||
| I have tried this gl_Position = ftransform(); and this.. gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; in the vertex shader any suggestions? | 
| 
 | ||
| Both of those do the same thing, ftransform is older. I'd need to see the full source. | 
| 
 | ||
| Ok it's just a simple greyscale shader that I'm currently trying out here: https://github.com/chudooder/entanglement/blob/master/shaders/greyscale.frag | 
| 
 | ||
| I'm not having any problems with it, it could be the image but I don't think so. Are you using the default.vert with it? ' sl_greyscale.bmx
Strict
Framework Openb3d.B3dglgraphics
Graphics3D 800,600,0,2
Local camera:TCamera=CreateCamera()
CameraClsColor camera,0,125,250
Local light:TLight=CreateLight()
Local cube:TMesh=CreateCube()
PositionEntity cube,-1.5,0,4
Local cube2:TMesh=CreateCube()
PositionEntity cube2,1.5,0,4
Local cone:TMesh=CreateCone()
PositionEntity cone,0,0,10
ScaleEntity cone,4,4,4
Local plane:TMesh=CreateCube()
ScaleEntity plane,10,0.1,10
MoveEntity plane,0,-1.5,0
Local shader:TShader=LoadShader("","shaders/default.vert.glsl","shaders/greyscale.frag.glsl")
ShaderTexture(shader,LoadTexture("media/colorkey.jpg"),"texture0",0)
ShadeEntity(cube,shader)
EntityFX(cube,32)
Local shader2:TShader=LoadShader("","shaders/default.vert.glsl","shaders/default.frag.glsl")
ShaderTexture(shader2,LoadTexture("media/colorkey.jpg"),"texture0",0)
ShadeEntity(cube2,shader2)
EntityFX(cube2,32)
Local efx%=1
While Not KeyDown(KEY_ESCAPE)
	' turn cubes
	If KeyDown(KEY_LEFT)
		TurnEntity cube,0,-0.5,0.1
		TurnEntity cube2,0,0.5,-0.1
	EndIf
	If KeyDown(KEY_RIGHT)
		TurnEntity cube,0,0.5,-0.1
		TurnEntity cube2,0,-0.5,0.1
	EndIf
	
	' alpha blending: alpha / nothing
	If KeyHit(KEY_B)
		efx=Not efx
		If efx
			EntityFX(cube,32) ; EntityFX(cube2,32)
		Else
			EntityFX(cube,0) ; EntityFX(cube2,0)
		EndIf
	EndIf
	
	RenderWorld
	
	Text 0,0,"Left/Right: turn cubes"+", B: alpha blending = "+efx
	
	Flip
Wend
End
 | 
| 
 | ||
|  the gl_Fragcolor image is always inverted.  I know what you're doing here now. You're rendering a texture to a sprite and it's upsidedown. You have to invert the y in the shader like this gl_TexCoord[0].st // change to vec2(gl_TexCoord[0].s, -gl_TexCoord[0].t) | 
| 
 | ||
| Thanks! What if I want to y-flip the resulting gl_FragColor itself in preparing for another operation or effect, is it possible? It's not important atm but just trying to learn some glsl stuff. | 
| 
 | ||
| I found a nice way to avoid inverting the y coords in the shader now. You use ScaleTexture shadertex,1,-1 before you call LoadShader. Edit: also you must multiply texcoords in the vert by gl_TextureMatrix[]. I think if you're doing a 2 pass shader (like in sl_2pass.bmx) the texture gets re-inverted so you don't need ScaleTexture in that case. Edit: wrong, this was due to the shader not multiplying by TextureMatrix. | 
| 
 | ||
| Awesome! :) |