I’m no expert on Blender Game Engine shaders, but I’ll give it a go.
From what I understand, you can use shaders in two distinct ways in the Blender Game Engine.
There are fullscreen 2D shaders, which can affect all of the pixels on the entire screen.
And material shaders, which only affect pixels/vertices of objects that the shader is applied. For example, if you have a cube with a material shader in a scene, only the pixels/vertices of the cube will be affected by the shader on the cube.
There are also two types of shaders defined by GLSL, fragment shaders (modify pixels), and vertex shaders (modify vertices).
Fullscreen 2D shaders can be controlled by the 2D filter actuator, and you can set this actuator to use a custom GLSL fragment shader that you wrote, though there are a number of great built-in shaders. The Fullscreen 2D shader must a fragment shader, not a vertex shader.
Material shaders can be controlled by many different factors. Most common shaders are available for use right in the material buttons themselves. You can set a texture as a “Nor” map, and blender will use it’s own normal map shader without you having to know anything about GLSL code. If you don’t know how to set a “Nor” map for the game engine, it’s the same material setup for if you were going to make a normal blender render.
For more complex shaders, you may use material nodes with the node window to create shaders that will run in the Blender Game Engine, and will also affect blender renders.
For even more complex shaders, you can in fact code them in GLSL yourself, and apply them in Python to an object’s material.
For material shaders, you can write Fragment and Vertex shaders.