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