| 两侧同时换到之前的修订记录
前一修订版
后一修订版
|
前一修订版
|
en:stpc-exxx-c [2026/11/14 02:47] wjj 3D 配色与光照对齐效果图 |
en:stpc-exxx-c [2026/11/14 03:52] (当前版本) wjj 3D 透视配色与透明度终值:蓝灰鬼影 + 内部零件加重 |
| var VS=['#version 300 es','in vec3 aP;in vec3 aN;uniform mat4 uP,uV;uniform vec3 uO;out vec3 vP;out vec3 vN;', | var VS=['#version 300 es','in vec3 aP;in vec3 aN;uniform mat4 uP,uV;uniform vec3 uO;out vec3 vP;out vec3 vN;', |
| 'void main(){vec3 p=aP+uO;vP=p;vN=aN;gl_Position=uP*uV*vec4(p,1.0);}'].join('\n'); | 'void main(){vec3 p=aP+uO;vP=p;vN=aN;gl_Position=uP*uV*vec4(p,1.0);}'].join('\n'); |
| var FS=['#version 300 es','precision highp float;in vec3 vP;in vec3 vN;uniform vec3 uC,uE;uniform float uS,uD,uX;uniform mat4 uV;out vec4 f;', | var FS=['#version 300 es','precision highp float;in vec3 vP;in vec3 vN;uniform vec3 uC,uE;uniform float uS,uD,uX,uA;uniform mat4 uV;out vec4 f;', |
| 'void main(){vec3 N=normalize(vN),V=normalize(uE-vP);if(dot(N,V)<0.0)N=-N;', | 'void main(){vec3 N=normalize(vN),V=normalize(uE-vP);if(dot(N,V)<0.0)N=-N;', |
| 'mat3 R=mat3(uV);vec3 Nv=normalize(R*N),Vv=normalize(R*V);vec3 L1=normalize(vec3(-0.42,0.58,0.70)),L2=normalize(vec3(0.60,-0.30,0.74));', | 'mat3 R=mat3(uV);vec3 Nv=normalize(R*N),Vv=normalize(R*V);vec3 L1=normalize(vec3(-0.42,0.58,0.70)),L2=normalize(vec3(0.60,-0.30,0.74));', |
| 'float sp=pow(max(dot(Nv,H),0.0),46.0)*0.30;float rm=pow(1.0-max(dot(Nv,Vv),0.0),3.0)*0.20;', | 'float sp=pow(max(dot(Nv,H),0.0),46.0)*0.30;float rm=pow(1.0-max(dot(Nv,Vv),0.0),3.0)*0.20;', |
| 'vec3 c=uC*(0.34+0.52*k1+0.20*k2)+vec3(sp)+vec3(rm)*0.55;', | 'vec3 c=uC*(0.34+0.52*k1+0.20*k2)+vec3(sp)+vec3(rm)*0.55;', |
| 'if(uS>0.5)c=mix(c,vec3(0.12,0.40,0.85),0.34);if(uD>0.5)c=mix(c,vec3(0.72,0.76,0.81),0.62);', | 'if(uS>0.5)c=mix(c,vec3(0.12,0.40,0.85),0.34);if(uX>0.5)c=mix(c,vec3(0.40,0.48,0.58),0.55);else if(uD>0.5)c=mix(c,vec3(0.72,0.76,0.81),0.62);', |
| 'float a=1.0-0.62*uX;if(uD>0.5)a*=0.40;f=vec4(c,a);}'].join('\n'); | 'float a=1.0;if(uD>0.5)a*=mix(0.40,1.0,uX);f=vec4(c,a*uA);}'].join('\n'); |
| function sh(t,s){var o=gl.createShader(t);gl.shaderSource(o,s);gl.compileShader(o); | function sh(t,s){var o=gl.createShader(t);gl.shaderSource(o,s);gl.compileShader(o); |
| if(!gl.getShaderParameter(o,gl.COMPILE_STATUS))throw new Error(gl.getShaderInfoLog(o));return o;} | if(!gl.getShaderParameter(o,gl.COMPILE_STATUS))throw new Error(gl.getShaderInfoLog(o));return o;} |
| gl.attachShader(pr,sh(gl.VERTEX_SHADER,VS));gl.attachShader(pr,sh(gl.FRAGMENT_SHADER,FS)); | gl.attachShader(pr,sh(gl.VERTEX_SHADER,VS));gl.attachShader(pr,sh(gl.FRAGMENT_SHADER,FS)); |
| gl.bindAttribLocation(pr,0,'aP');gl.bindAttribLocation(pr,1,'aN');gl.linkProgram(pr);gl.useProgram(pr); | gl.bindAttribLocation(pr,0,'aP');gl.bindAttribLocation(pr,1,'aN');gl.linkProgram(pr);gl.useProgram(pr); |
| var U={};['uP','uV','uO','uC','uE','uS','uD','uX'].forEach(function(n){U[n]=gl.getUniformLocation(pr,n);}); | var U={};['uP','uV','uO','uC','uE','uS','uD','uX','uA'].forEach(function(n){U[n]=gl.getUniformLocation(pr,n);}); |
| |
| var cam={th:0.60,ph:0.19,dist:3,tgt:[0,0,0],fov:34*Math.PI/180}; | var cam={th:0.60,ph:0.19,dist:3,tgt:[0,0,0],fov:34*Math.PI/180}; |
| gl.viewport(0,0,cv.width,cv.height); | gl.viewport(0,0,cv.width,cv.height); |
| gl.clearColor(0,0,0,0);gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT); | gl.clearColor(0,0,0,0);gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT); |
| gl.enable(gl.DEPTH_TEST);gl.disable(gl.CULL_FACE);gl.enable(gl.BLEND); | if(xray){gl.disable(gl.DEPTH_TEST);}else{gl.enable(gl.DEPTH_TEST);}gl.disable(gl.CULL_FACE);gl.enable(gl.BLEND); |
| gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA); | gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA); |
| var e=eye(); | var e=eye(); |
| gl.uniform3fv(U.uO,off(p)); | gl.uniform3fv(U.uO,off(p)); |
| gl.uniform1f(U.uS,p.pi===sel?1:0); | gl.uniform1f(U.uS,p.pi===sel?1:0); |
| gl.uniform1f(U.uD,(any&&p.pi!==sel)||xray?1:0); | gl.uniform1f(U.uD,(any&&p.pi!==sel)?1:0); |
| | gl.uniform1f(U.uA, xray ? (p.pi===sel ? 1.0 : (Math.max(p.size[0],p.size[1],p.size[2])>0.075?0.20:0.62)) : 1.0); |
| gl.uniform1f(U.uX,xray&&p.pi!==sel?1:0); | gl.uniform1f(U.uX,xray&&p.pi!==sel?1:0); |
| gl.drawElements(gl.TRIANGLES,p.count,gl.UNSIGNED_INT,p.start*4); | gl.drawElements(gl.TRIANGLES,p.count,gl.UNSIGNED_INT,p.start*4); |