赣州市洪水风险预警系统三维版本
guoshilong
2023-02-27 4d8c6dd77427e8e581fda17b6b65ba86bfb7a815
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import PixelFormat from '../Core/PixelFormat.js';
import CheckFloatTexturePrecisionFS from '../Shaders/CheckFloatTexturePrecisionFS.js';
import ComputeCommand from './ComputeCommand.js';
import ComputeEngine from './ComputeEngine.js';
import Framebuffer from './Framebuffer.js';
import PixelDatatype from './PixelDatatype.js';
import Texture from './Texture.js';
 
    /**
     * Checks if the context's floating point textures support 6 decimal places of precision.
     *
     * @param {Context} context A context wrapping a gl implementation.
     * @returns {Boolean} Whether or not the context's floating point textures support 6 decimal places of precision
     *
     * @private
     */
    function checkFloatTexturePrecision(context) {
        if (!context.floatingPointTexture) {
            return false;
        }
 
        var computeEngine = new ComputeEngine(context);
        var outputTexture = new Texture({
            context : context,
            width : 1,
            height : 1,
            pixelFormat : PixelFormat.RGBA
        });
 
        var floatTexture = new Texture({
            context : context,
            width : 1,
            height : 1,
            pixelFormat : PixelFormat.RGBA,
            pixelDatatype : checkFloatTexturePrecision._getFloatPixelType(),
            source : {
                width : 1,
                height : 1,
                arrayBufferView : checkFloatTexturePrecision._getArray([123456, 0, 0, 0])
            }
        });
 
        var framebuffer = new Framebuffer({
            context : context,
            colorTextures : [outputTexture],
            destroyAttachments : false
        });
 
        var readState = {
            framebuffer : framebuffer,
            x : 0,
            y : 0,
            width : 1,
            height : 1
        };
 
        var sixPlaces = false;
        var computeCommand = new ComputeCommand({
            fragmentShaderSource : CheckFloatTexturePrecisionFS,
            outputTexture : outputTexture,
            uniformMap : {
                u_floatTexture : function() {
                    return floatTexture;
                }
            },
            persists : false,
            postExecute : function() {
                var pixel = context.readPixels(readState);
                sixPlaces = pixel[0] === 0;
            }
        });
 
        computeCommand.execute(computeEngine);
 
        computeEngine.destroy();
        framebuffer.destroy();
 
        return sixPlaces;
    }
 
    checkFloatTexturePrecision._getFloatPixelType = function() {
        return PixelDatatype.FLOAT;
    };
 
    checkFloatTexturePrecision._getArray = function(array) {
        return new Float32Array(array);
    };
export default checkFloatTexturePrecision;