00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #version 110
00023
00024
00025
00026
00027
00028 varying vec3 oglcolor;
00029 varying vec3 V;
00030
00031 uniform vec3 vmdlight0;
00032 uniform vec3 vmdlight1;
00033 uniform vec3 vmdlight2;
00034 uniform vec3 vmdlight3;
00035
00036 uniform vec3 vmdlight0H;
00037 uniform vec3 vmdlight1H;
00038 uniform vec3 vmdlight2H;
00039 uniform vec3 vmdlight3H;
00040
00041 uniform vec4 vmdlightscale;
00042
00043
00044
00045
00046
00047
00048 uniform vec4 vmdmaterial;
00049
00050
00051
00052
00053
00054 uniform float vmdopacity;
00055
00056 uniform float vmdoutline;
00057
00058 uniform float vmdoutlinewidth;
00059
00060 uniform int vmdtransmode;
00061
00062 uniform int vmdfogmode;
00063
00064 uniform int vmdtexturemode;
00065 uniform sampler3D vmdtex0;
00066
00067
00068
00069
00070 void main(void) {
00071
00072
00073 vec2 pos = gl_TexCoord[0].xy - vec2(0.5, 0.5);
00074 float r2 = pos.x*pos.x + pos.y*pos.y;
00075 if (r2 > 0.25)
00076 discard;
00077
00078 #if 0
00079 vec3 texcolor;
00080
00081
00082 if (vmdtexturemode != 0) {
00083 texcolor = vec3(texture3D(vmdtex0, gl_TexCoord[0].xyz));
00084 }
00085 #endif
00086
00087
00088
00089 vec3 N = 2.0*vec3(pos.x, -pos.y, sqrt(0.25 - r2));
00090
00091
00092 float ambient = vmdmaterial[0];
00093 float diffuse = 0.0;
00094 float specular = 0.0;
00095 float shininess = vmdmaterial[3];
00096
00097
00098 diffuse += max(0.0, dot(N, vmdlight0)) * vmdlightscale[0];
00099 diffuse += max(0.0, dot(N, vmdlight1)) * vmdlightscale[1];
00100 diffuse += max(0.0, dot(N, vmdlight2)) * vmdlightscale[2];
00101 diffuse += max(0.0, dot(N, vmdlight3)) * vmdlightscale[3];
00102 diffuse *= vmdmaterial[1];
00103
00104
00105 if (vmdoutline > 0.0) {
00106 float edgefactor = dot(N,V);
00107 edgefactor = 1.0 - (edgefactor*edgefactor);
00108 edgefactor = 1.0 - pow(edgefactor, (1.0-vmdoutlinewidth)*32.0);
00109 diffuse = mix(diffuse, diffuse * edgefactor, vmdoutline);
00110 }
00111
00112
00113
00114 specular += pow(max(0.0, dot(N, vmdlight0H)), shininess) * vmdlightscale[0];
00115 specular += pow(max(0.0, dot(N, vmdlight1H)), shininess) * vmdlightscale[1];
00116 specular += pow(max(0.0, dot(N, vmdlight2H)), shininess) * vmdlightscale[2];
00117 specular += pow(max(0.0, dot(N, vmdlight3H)), shininess) * vmdlightscale[3];
00118 specular *= vmdmaterial[2];
00119
00120
00121 const float Log2E = 1.442695;
00122 float fog = 1.0;
00123 if (vmdfogmode == 1) {
00124
00125 fog = (gl_Fog.end - gl_FogFragCoord) * gl_Fog.scale;
00126 } else if (vmdfogmode == 2) {
00127
00128 fog = exp2(-gl_Fog.density * gl_FogFragCoord * Log2E);
00129 } else if (vmdfogmode == 3) {
00130
00131 fog = exp2(-gl_Fog.density * gl_Fog.density * gl_FogFragCoord * gl_FogFragCoord * Log2E);
00132 }
00133 fog = clamp(fog, 0.0, 1.0);
00134
00135 vec3 objcolor = oglcolor * vec3(diffuse);
00136 #if 0
00137 if (vmdtexturemode == 1) {
00138 objcolor = oglcolor * texcolor * vec3(diffuse);
00139 } else if (vmdtexturemode == 2) {
00140 objcolor = texcolor;
00141 }
00142 #endif
00143
00144 vec3 color = objcolor + vec3(ambient + specular);
00145
00146 float alpha = vmdopacity;
00147
00148
00149 if (vmdtransmode==1) {
00150 alpha = 1.0 + cos(3.1415926 * (1.0-alpha) * dot(N,V));
00151 alpha = alpha*alpha * 0.25;
00152 }
00153
00154 gl_FragColor = vec4(mix(vec3(gl_Fog.color), color, fog), alpha);
00155 }
00156
00157