From: Loren P. <pe...@pa...> - 2012-02-18 03:23:55
|
On Jan 26, 2012, at 5:55 AM, Gregory Smith wrote: > >> As to the filters for hits and under liquids, one might be able to get >> closer to the software-rendering originals with suitable fragment >> shaders, effects like solarization. One might also be able to make the >> "static" effect. I've found GLSL functions for doing both: mod and >> noise. > > Yeah, that would be nice. The appromixations in fixed function OpenGL are > inauthentic. > > We do have a nice "static" effect shader for inhabitants and walls, > though! GLSL's noise function is poorly supported, so we use something > different. Look at the "invincible" fragment program in OGL_Shaders.cpp. > This could be adapted for use with the weapons in hand, and fullscreen > faders. Apple's developer tools contain a nice OpenGL Shader Builder app, and I used it to write some shader experiments. Here's a fragment shader that can do solarization. Tint contains the solarization tint; set components to more than 1 to produce that effect. Trans is for adjustment: 0 for no effect, 1 for full effect. uniform sampler2D tex; // Control from outside uniform float Trans; uniform vec4 Tint; void main() { vec4 Color = gl_Color * texture2D(tex, gl_TexCoord[0].xy); float Alpha = Color[3]; // Get the opacity; it's to be unchanged // Solarization vec4 ColorX = Tint * Color; ColorX = mod(ColorX,1.001); gl_FragColor = mix(Color, ColorX, Trans); /* // Negation vec4 MxdCol = mix(Color, 1.0-Color, Tint); vec4 LoCol = min(MxdCol-Trans,Color); vec4 HiCol = max(MxdCol+Trans,Color); gl_FragColor = mix(HiCol,LoCol,step(0.5,Color)); */ /* // Dodge gl_FragColor = max(1.0-(1.0-Tint)*Color-Trans,Color); */ /* // Burn gl_FragColor = max(Tint*Color+Trans,Color); */ gl_FragColor[3] = Alpha; // Use it } [end] However, I couldn't find any way to get a background pixel value into a shader program. It might be necessary to use such kludges as reading from the scene into a texture, then rendering that texture into a view-sized polygon with a fragment shader. On a more pleasant note, I figured out how to do floor-to-ceiling lighting for 3D models in a vertex shader. This is because the engine provides lighting values for the floor and the ceiling of a polygon, and I'd implemented it long ago in fixed-function OpenGL. // Control from outside uniform vec4 FloorColor; uniform vec4 CeilingColor; void main() { gl_FrontColor = gl_Color; gl_TexCoord[0] = gl_MultiTexCoord0; gl_Position = ftransform(); // Floor-to-ceiling shader; needs normal vector vec3 Normal = normalize(gl_NormalMatrix * gl_Normal); // Is 0 for floorward and 1 for ceilingward float FloorCeilMix = 0.5 * (1.0 + Normal[1]); // Do floor-ceiling coloring on the colors proper // but not the opacity float Alpha = gl_FrontColor[3]; gl_FrontColor *= mix(FloorColor,CeilingColor,FloorCeilMix); gl_FrontColor[3] = Alpha; } [end] -- Loren |