Add fog with basic shader
This commit is contained in:
		
							parent
							
								
									817223c151
								
							
						
					
					
						commit
						9a8deef6ae
					
				@ -54,6 +54,9 @@ class Axis extends GLContextObject{
 | 
				
			|||||||
        shader.radius([this.r, this.r, this.r]);
 | 
					        shader.radius([this.r, this.r, this.r]);
 | 
				
			||||||
        shader.position(this.pos);
 | 
					        shader.position(this.pos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        shader.fogColor(this.renderer.fogColor);
 | 
				
			||||||
 | 
					        shader.fogDensity(this.renderer.fogDensity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 绘制 X 轴
 | 
					        // 绘制 X 轴
 | 
				
			||||||
        shader.color([1, 0, 0]);
 | 
					        shader.color([1, 0, 0]);
 | 
				
			||||||
        this.gl.drawArrays(this.gl.LINES, 0, 2);
 | 
					        this.gl.drawArrays(this.gl.LINES, 0, 2);
 | 
				
			||||||
 | 
				
			|||||||
@ -50,7 +50,7 @@ class BaseCube extends GLContextObject{
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 颜色
 | 
					     * 颜色
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public color = [.5, .5, .5];
 | 
					    public color = [1, 1, 1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 绘制立方体
 | 
					     * 绘制立方体
 | 
				
			||||||
@ -79,6 +79,9 @@ class BaseCube extends GLContextObject{
 | 
				
			|||||||
        // 指定颜色
 | 
					        // 指定颜色
 | 
				
			||||||
        shader.color(this.color);
 | 
					        shader.color(this.color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        shader.fogColor(this.renderer.fogColor);
 | 
				
			||||||
 | 
					        shader.fogDensity(this.renderer.fogDensity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 开始绘制
 | 
					        // 开始绘制
 | 
				
			||||||
        this.gl.drawElements(this.gl.LINES, 24, this.gl.UNSIGNED_SHORT, 0);
 | 
					        this.gl.drawElements(this.gl.LINES, 24, this.gl.UNSIGNED_SHORT, 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -12,7 +12,9 @@ interface IBasicsShaderUniform {
 | 
				
			|||||||
    uRadius: ObjectData,
 | 
					    uRadius: ObjectData,
 | 
				
			||||||
    uMvp: ObjectData,
 | 
					    uMvp: ObjectData,
 | 
				
			||||||
    uPosition: ObjectData,
 | 
					    uPosition: ObjectData,
 | 
				
			||||||
    uColor: ObjectData
 | 
					    uColor: ObjectData,
 | 
				
			||||||
 | 
					    uFogColor: ObjectData,
 | 
				
			||||||
 | 
					    uFogDensity: ObjectData
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -31,8 +33,11 @@ class BasicsShader extends GLShader<IBasicsShaderAttribute, IBasicsShaderUniform
 | 
				
			|||||||
            uniform mat4 uMvp;
 | 
					            uniform mat4 uMvp;
 | 
				
			||||||
            uniform vec3 uPosition;
 | 
					            uniform vec3 uPosition;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            varying vec3 vPosition;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            void main(){
 | 
					            void main(){
 | 
				
			||||||
                gl_Position = uMvp * vec4(aPosition * uRadius + uPosition, 1.);
 | 
					                gl_Position = uMvp * vec4(aPosition * uRadius + uPosition, 1.);
 | 
				
			||||||
 | 
					                vPosition = gl_Position.xyz;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        `;
 | 
					        `;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -40,10 +45,18 @@ class BasicsShader extends GLShader<IBasicsShaderAttribute, IBasicsShaderUniform
 | 
				
			|||||||
        const fragment = `
 | 
					        const fragment = `
 | 
				
			||||||
            precision lowp float;
 | 
					            precision lowp float;
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
 | 
					            uniform vec3 uFogColor;
 | 
				
			||||||
            uniform vec3 uColor;
 | 
					            uniform vec3 uColor;
 | 
				
			||||||
 | 
					            uniform vec3 uFogDensity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            varying vec3 vPosition;
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
            void main(){
 | 
					            void main(){
 | 
				
			||||||
                gl_FragColor = vec4(uColor, 1.);
 | 
					                float disClamp = clamp(vPosition.z, uFogDensity.y, uFogDensity.z);
 | 
				
			||||||
 | 
					                float disNormal = (disClamp - uFogDensity.y) / (uFogDensity.z - uFogDensity.y);
 | 
				
			||||||
 | 
					                float vFogPower = clamp(disNormal * uFogDensity.x, 0., 1.);
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                gl_FragColor = vec4(mix(uColor, uFogColor, vFogPower), 1.);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        `;
 | 
					        `;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -92,4 +105,22 @@ class BasicsShader extends GLShader<IBasicsShaderAttribute, IBasicsShaderUniform
 | 
				
			|||||||
            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
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -47,9 +47,10 @@ class ClassicRenderer extends BasicRenderer<{}, IClassicRendererParams> {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const cubeRadius = 2**.5;
 | 
					        const cubeRadius = 2**.5;
 | 
				
			||||||
 | 
					        const farFogLine = 2.5;
 | 
				
			||||||
        this.fogDensity = [
 | 
					        this.fogDensity = [
 | 
				
			||||||
            this.fogDensity[0], this.camera.eye[2] - cubeRadius, 
 | 
					            this.fogDensity[0], this.camera.eye[2] - cubeRadius, 
 | 
				
			||||||
            this.camera.eye[2] + cubeRadius + 4
 | 
					            this.camera.eye[2] + cubeRadius + farFogLine
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.canvas.on("mousewheel", () => {
 | 
					        this.canvas.on("mousewheel", () => {
 | 
				
			||||||
@ -57,12 +58,17 @@ class ClassicRenderer extends BasicRenderer<{}, IClassicRendererParams> {
 | 
				
			|||||||
            let dist = this.camera.eyeDist;
 | 
					            let dist = this.camera.eyeDist;
 | 
				
			||||||
            this.fogDensity = [
 | 
					            this.fogDensity = [
 | 
				
			||||||
                this.fogDensity[0], dist - cubeRadius, 
 | 
					                this.fogDensity[0], dist - cubeRadius, 
 | 
				
			||||||
                dist + cubeRadius + 4
 | 
					                dist + cubeRadius + farFogLine
 | 
				
			||||||
            ];
 | 
					            ];
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        // 运行
 | 
					        // 运行
 | 
				
			||||||
        this.run();
 | 
					        this.run();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 测试数据传递
 | 
				
			||||||
 | 
					        // setInterval(() => {
 | 
				
			||||||
 | 
					        //     this.basicGroup.upLoadData(new Array(100 * 3).fill(0).map(() => (Math.random() - .5) * 2));
 | 
				
			||||||
 | 
					        // }, 500);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    loop(t: number): void {
 | 
					    loop(t: number): void {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user