Add fog group with renderer
This commit is contained in:
		
							parent
							
								
									a0840d07c7
								
							
						
					
					
						commit
						817223c151
					
				@ -33,7 +33,7 @@ class BasicGroup extends GLContextObject{
 | 
				
			|||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * 大小
 | 
						 * 大小
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public size = 100;
 | 
						public size = 50;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 颜色
 | 
					     * 颜色
 | 
				
			||||||
@ -65,6 +65,9 @@ class BasicGroup extends GLContextObject{
 | 
				
			|||||||
        // 指定颜色
 | 
					        // 指定颜色
 | 
				
			||||||
        shader.color(this.color);
 | 
					        shader.color(this.color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        shader.fogColor(this.renderer.fogColor);
 | 
				
			||||||
 | 
					        shader.fogDensity(this.renderer.fogDensity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 开始绘制
 | 
					        // 开始绘制
 | 
				
			||||||
        this.gl.drawArrays(this.gl.POINTS, 0, this.pointVecCount);
 | 
					        this.gl.drawArrays(this.gl.POINTS, 0, this.pointVecCount);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -112,6 +112,25 @@ abstract class BasicRenderer<
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public cleanColor: [number, number, number, number] = [.1, .1, .1, 1.];
 | 
					    public cleanColor: [number, number, number, number] = [.1, .1, .1, 1.];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 雾颜色
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public get fogColor() {
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					            this.cleanColor[0],
 | 
				
			||||||
 | 
					            this.cleanColor[1],
 | 
				
			||||||
 | 
					            this.cleanColor[2]
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 雾强度
 | 
				
			||||||
 | 
					     * 参数一:浓度系数
 | 
				
			||||||
 | 
					     * 参数二:起始位置
 | 
				
			||||||
 | 
					     * 参数三:结束位置
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public fogDensity: [number, number, number] = [1, 5, 20];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 清屏
 | 
					     * 清屏
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
				
			|||||||
@ -46,8 +46,19 @@ class ClassicRenderer extends BasicRenderer<{}, IClassicRendererParams> {
 | 
				
			|||||||
            this.canvas.can.style.cursor = "grab"
 | 
					            this.canvas.can.style.cursor = "grab"
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const cubeRadius = 2**.5;
 | 
				
			||||||
 | 
					        this.fogDensity = [
 | 
				
			||||||
 | 
					            this.fogDensity[0], this.camera.eye[2] - cubeRadius, 
 | 
				
			||||||
 | 
					            this.camera.eye[2] + cubeRadius + 4
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.canvas.on("mousewheel", () => {
 | 
					        this.canvas.on("mousewheel", () => {
 | 
				
			||||||
            this.camera.eyeScale(this.canvas.wheelDelta / 100);
 | 
					            this.camera.eyeScale(this.canvas.wheelDelta / 100);
 | 
				
			||||||
 | 
					            let dist = this.camera.eyeDist;
 | 
				
			||||||
 | 
					            this.fogDensity = [
 | 
				
			||||||
 | 
					                this.fogDensity[0], dist - cubeRadius, 
 | 
				
			||||||
 | 
					                dist + cubeRadius + 4
 | 
				
			||||||
 | 
					            ];
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        // 运行
 | 
					        // 运行
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,9 @@ interface IGroupShaderAttribute {
 | 
				
			|||||||
interface IGroupShaderUniform {
 | 
					interface IGroupShaderUniform {
 | 
				
			||||||
    uRadius: number,
 | 
					    uRadius: number,
 | 
				
			||||||
    uMvp: ObjectData,
 | 
					    uMvp: ObjectData,
 | 
				
			||||||
    uColor: ObjectData
 | 
					    uColor: ObjectData,
 | 
				
			||||||
 | 
					    uFogColor: ObjectData,
 | 
				
			||||||
 | 
					    uFogDensity: ObjectData
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -28,10 +30,17 @@ class GroupShader extends GLShader<IGroupShaderAttribute, IGroupShaderUniform>{
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
            uniform float uRadius;
 | 
					            uniform float uRadius;
 | 
				
			||||||
            uniform mat4 uMvp;
 | 
					            uniform mat4 uMvp;
 | 
				
			||||||
 | 
					            uniform vec3 uFogDensity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            varying float vFogPower; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            void main(){
 | 
					            void main(){
 | 
				
			||||||
                gl_Position = uMvp * vec4(aPosition, 1.);
 | 
					                gl_Position = uMvp * vec4(aPosition, 1.);
 | 
				
			||||||
				gl_PointSize = uRadius / gl_Position.z;
 | 
									gl_PointSize = uRadius / gl_Position.z;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                float disClamp = clamp(gl_Position.z, uFogDensity.y, uFogDensity.z);
 | 
				
			||||||
 | 
					                float disNormal = (disClamp - uFogDensity.y) / (uFogDensity.z - uFogDensity.y);
 | 
				
			||||||
 | 
					                vFogPower = clamp(disNormal * uFogDensity.x, 0., 1.);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        `;
 | 
					        `;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -40,9 +49,12 @@ class GroupShader extends GLShader<IGroupShaderAttribute, IGroupShaderUniform>{
 | 
				
			|||||||
            precision lowp float;
 | 
					            precision lowp float;
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            uniform vec3 uColor;
 | 
					            uniform vec3 uColor;
 | 
				
			||||||
 | 
					            uniform vec3 uFogColor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            varying float vFogPower;
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
            void main(){
 | 
					            void main(){
 | 
				
			||||||
                gl_FragColor = vec4(uColor, 1.);
 | 
					                gl_FragColor = vec4(mix(uColor, uFogColor, vFogPower), 1.);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        `;
 | 
					        `;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -81,4 +93,22 @@ class GroupShader extends GLShader<IGroupShaderAttribute, IGroupShaderUniform>{
 | 
				
			|||||||
            this.uniformLocate("uColor"), rgb
 | 
					            this.uniformLocate("uColor"), rgb
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 雾颜色
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public fogColor(rgb: ObjectData) {
 | 
				
			||||||
 | 
					        this.gl.uniform3fv(
 | 
				
			||||||
 | 
					            this.uniformLocate("uFogColor"), rgb
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 雾强度
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public fogDensity(rgb: ObjectData) {
 | 
				
			||||||
 | 
					        this.gl.uniform3fv(
 | 
				
			||||||
 | 
					            this.uniformLocate("uFogDensity"), rgb
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user