Với WebGL Overlay View, bạn có thể thêm nội dung vào bản đồ bằng cách sử dụng trực tiếp WebGL hoặc các thư viện đồ hoạ phổ biến như Three.js. Lớp phủ WebGL cung cấp quyền truy cập trực tiếp vào cùng một ngữ cảnh kết xuất WebGL mà Nền tảng Google Maps dùng để kết xuất bản đồ cơ sở dạng vectơ. Việc sử dụng ngữ cảnh kết xuất dùng chung này mang lại nhiều lợi ích, chẳng hạn như độ che khuất theo chiều sâu với hình học toà nhà 3D và khả năng đồng bộ hoá nội dung 2D/3D với hoạt động kết xuất bản đồ cơ sở. Các đối tượng được kết xuất bằng WebGL Overlay View cũng có thể được liên kết với toạ độ vĩ độ/kinh độ, vì vậy, chúng sẽ di chuyển khi bạn kéo, thu phóng, xoay hoặc nghiêng bản đồ.
Yêu cầu
Để sử dụng Lớp phủ WebGL, bạn phải tải bản đồ bằng mã bản đồ có bản đồ vectơ được bật. Bạn nên bật chế độ nghiêng và xoay khi tạo mã bản đồ để cho phép kiểm soát hoàn toàn camera 3D.
Xem thông tin tổng quan để biết chi tiết.
Thêm Chế độ xem lớp phủ WebGL
Để thêm lớp phủ vào bản đồ, hãy triển khai google.maps.WebGLOverlayView, sau đó truyền phiên bản bản đồ bằng setMap:
// Create a map instance.constmap=newgoogle.maps.Map(mapDiv,mapOptions);// Create a WebGL Overlay View instance.constwebglOverlayView=newgoogle.maps.WebGLOverlayView();// Add the overlay to the map.webglOverlayView.setMap(map);
Lifecycle hooks
WebGL Overlay View cung cấp một bộ các hook được gọi vào nhiều thời điểm trong vòng đời của ngữ cảnh kết xuất WebGL của bản đồ cơ sở vectơ. Đây là những hook vòng đời mà bạn thiết lập, vẽ và tháo dỡ mọi thứ bạn muốn hiển thị trong lớp phủ.
onAdd() được gọi khi lớp phủ được tạo. Sử dụng phương thức này để tìm nạp hoặc tạo cấu trúc dữ liệu trung gian trước khi lớp phủ được vẽ mà không yêu cầu quyền truy cập ngay vào ngữ cảnh kết xuất WebGL.
onContextRestored({gl}) được gọi khi có sẵn ngữ cảnh kết xuất. Sử dụng hàm này để khởi tạo hoặc liên kết mọi trạng thái WebGL, chẳng hạn như chương trình đổ bóng, đối tượng vùng đệm GL, v.v. onContextRestored() lấy một thực thể WebGLStateOptions có một trường duy nhất:
gl là một đối tượng xử lý cho WebGLRenderingContext mà bản đồ cơ sở sử dụng.
onDraw({gl, transformer}) kết xuất cảnh trên bản đồ cơ sở.
Các tham số cho onDraw() là đối tượng WebGLDrawOptions, có hai trường:
gl là một đối tượng xử lý cho WebGLRenderingContext mà bản đồ cơ sở sử dụng.
transformer cung cấp các hàm trợ giúp để chuyển đổi từ toạ độ bản đồ sang ma trận chiếu mô hình-khung hiển thị. Bạn có thể dùng ma trận này để chuyển đổi toạ độ bản đồ sang không gian thế giới, không gian camera và không gian màn hình.
onContextLost() được gọi khi ngữ cảnh kết xuất bị mất vì bất kỳ lý do nào và là nơi bạn nên dọn dẹp mọi trạng thái GL đã có từ trước vì trạng thái đó không còn cần thiết nữa.
onStateUpdate({gl}) cập nhật trạng thái GL bên ngoài vòng lặp kết xuất và được gọi khi requestStateUpdate được gọi. Phương thức này lấy một thực thể WebGLStateOptions có một trường duy nhất:
gl là một đối tượng xử lý cho WebGLRenderingContext mà bản đồ cơ sở sử dụng.
onRemove() được gọi khi lớp phủ bị xoá khỏi bản đồ bằng WebGLOverlayView.setMap(null) và là nơi bạn nên xoá tất cả các đối tượng trung gian.
Ví dụ: sau đây là một cách triển khai cơ bản của tất cả các hook vòng đời:
constwebglOverlayView=newgoogle.maps.WebGLOverlayView();webglOverlayView.onAdd=()=>{// Do setup that does not require access to rendering context.}webglOverlayView.onContextRestored=({gl})=>{// Do setup that requires access to rendering context before onDraw call.}webglOverlayView.onStateUpdate=({gl})=>{// Do GL state setup or updates outside of the render loop.}webglOverlayView.onDraw=({gl,transformer})=>{// Render objects.}webglOverlayView.onContextLost=()=>{// Clean up pre-existing GL state.}webglOverlayView.onRemove=()=>{// Remove all intermediate objects.}webglOverlayView.setMap(map);
Đặt lại trạng thái GL
Chế độ xem lớp phủ WebGL hiển thị ngữ cảnh kết xuất WebGL của bản đồ cơ sở. Vì vậy, bạn cần phải đặt lại trạng thái GL về trạng thái ban đầu khi hoàn tất việc kết xuất các đối tượng. Việc không đặt lại trạng thái GL có thể dẫn đến xung đột trạng thái GL, khiến quá trình kết xuất cả bản đồ và mọi đối tượng mà bạn chỉ định đều không thành công.
Việc đặt lại trạng thái GL thường được xử lý trong lệnh gọi onDraw(). Ví dụ: Three.js cung cấp một hàm trợ giúp giúp xoá mọi thay đổi đối với trạng thái GL:
webglOverlayView.onDraw=({gl,transformer})=>{// Specify an object to render.renderer.render(scene,camera);renderer.resetState();}
Nếu bản đồ hoặc các đối tượng của bạn không kết xuất được, rất có thể trạng thái GL chưa được đặt lại.
Phép biến đổi toạ độ
Vị trí của một đối tượng trên bản đồ vectơ được chỉ định bằng cách cung cấp tổ hợp toạ độ vĩ độ và kinh độ, cũng như độ cao. Tuy nhiên, đồ hoạ 3D được chỉ định trong không gian thế giới, không gian camera hoặc không gian màn hình.
Để giúp bạn dễ dàng chuyển đổi toạ độ trên bản đồ sang những không gian thường dùng này, Chế độ xem lớp phủ WebGL cung cấp hàm trợ giúp coordinateTransformer.fromLatLngAltitude(latLngAltitude, rotationArr,
scalarArr) trong hook onDraw(). Hàm này nhận các giá trị sau và trả về Float64Array:
latLngAltitude: Toạ độ vĩ độ/kinh độ/độ cao dưới dạng LatLngAltitude hoặc LatLngAltitudeLiteral.
rotationArr: Float32Array của các góc xoay Euler được chỉ định theo độ.
scalarArr: Float32Array của các đại lượng vô hướng cần áp dụng cho trục chính.
Ví dụ: đoạn mã sau đây sử dụng fromLatLngAltitude() để tạo ma trận phép chiếu camera trong Three.js:
Sau đây là một ví dụ đơn giản về cách sử dụng Three.js, một thư viện WebGL nguồn mở phổ biến, để đặt một đối tượng 3D trên bản đồ. Để xem hướng dẫn đầy đủ về cách sử dụng Chế độ xem lớp phủ WebGL để tạo ví dụ mà bạn thấy đang chạy ở đầu trang này, hãy thử Lớp học lập trình Xây dựng trải nghiệm bản đồ được tăng tốc bằng WebGL.
constwebglOverlayView=newgoogle.maps.WebGLOverlayView();letscene,renderer,camera,loader;webglOverlayView.onAdd=()=>{// Set up the Three.js scene.scene=newTHREE.Scene();camera=newTHREE.PerspectiveCamera();constambientLight=newTHREE.AmbientLight(0xffffff,0.75);// Soft white light.scene.add(ambientLight);// Load the 3D model with GLTF Loader from Three.js.loader=newGLTFLoader();loader.load("pin.gltf");}webglOverlayView.onContextRestored=({gl})=>{// Create the Three.js renderer, using the// maps's WebGL rendering context.renderer=newTHREE.WebGLRenderer({canvas:gl.canvas,context:gl,...gl.getContextAttributes(),});renderer.autoClear=false;}webglOverlayView.onDraw=({gl,transformer})=>{// Update camera matrix to ensure the model is georeferenced correctly on the map.constmatrix=transformer.fromLatLngAltitude({lat:mapOptions.center.lat,lng:mapOptions.center.lng,altitude:120,});camera.projectionMatrix=newTHREE.Matrix4().fromArray(matrix);// Request a redraw and render the scene.webglOverlayView.requestRedraw();renderer.render(scene,camera);// Always reset the GL state.renderer.resetState();}// Add the overlay to the map.webglOverlayView.setMap(map);
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-09-05 UTC."],[[["\u003cp\u003eWebGL Overlay View empowers you to seamlessly integrate 3D and 2D content into Google Maps using WebGL directly or via libraries like Three.js, leveraging the same rendering context for synchronized visuals and depth occlusion with buildings.\u003c/p\u003e\n"],["\u003cp\u003eIt's crucial to load the map with a vector map enabled map ID, ideally with tilt and rotation activated, to fully utilize 3D camera control and functionalities.\u003c/p\u003e\n"],["\u003cp\u003eWebGL Overlay View offers lifecycle hooks like \u003ccode\u003eonAdd\u003c/code\u003e, \u003ccode\u003eonContextRestored\u003c/code\u003e, \u003ccode\u003eonDraw\u003c/code\u003e, \u003ccode\u003eonContextLost\u003c/code\u003e, \u003ccode\u003eonStateUpdate\u003c/code\u003e, and \u003ccode\u003eonRemove\u003c/code\u003e, providing control over setup, rendering, and teardown of your overlay elements.\u003c/p\u003e\n"],["\u003cp\u003eRemember to reset the GL state after rendering using methods like \u003ccode\u003erenderer.resetState()\u003c/code\u003e (Three.js) to avoid rendering conflicts and ensure proper functionality.\u003c/p\u003e\n"],["\u003cp\u003eUtilize the \u003ccode\u003ecoordinateTransformer.fromLatLngAltitude()\u003c/code\u003e helper function within \u003ccode\u003eonDraw\u003c/code\u003e to transform latitude/longitude/altitude coordinates to world/camera/screen space for accurate object placement and georeferencing.\u003c/p\u003e\n"]]],[],null,["# WebGL Overlay View\n\n\u003cbr /\u003e\n\n\n[View Sample](/maps/documentation/javascript/examples/webgl/webgl-overlay-simple)\n\nWith WebGL Overlay View you can add content to your maps using WebGL directly,\nor popular Graphics libraries like Three.js. WebGL Overlay View provides direct\naccess to the same WebGL rendering context Google Maps Platform uses to render\nthe vector basemap. This use of a shared rendering context provides benefits\nsuch as depth occlusion with 3D building geometry, and the ability to sync 2D/3D\ncontent with basemap rendering. Objects rendered with the WebGL Overlay View can\nalso be tied to latitude/longitude coordinates, so they move when you drag,\nzoom, pan, or tilt the map.\n\nRequirements\n------------\n\nTo use WebGL Overlay View, you must load the map using a map ID with the vector\nmap enabled. We strongly recommend enabling tilt and rotation when you create\nthe map ID, to allow for full 3D camera control.\n[See the overview for details](/maps/documentation/javascript/webgl).\n\nAdd WebGL Overlay View\n----------------------\n\nTo add the overlay to your map, implement `google.maps.WebGLOverlayView`, then\npass it your map instance using `setMap`: \n\n // Create a map instance.\n const map = new google.maps.Map(mapDiv, mapOptions);\n\n // Create a WebGL Overlay View instance.\n const webglOverlayView = new google.maps.WebGLOverlayView();\n\n // Add the overlay to the map.\n webglOverlayView.setMap(map);\n\nLifecycle hooks\n---------------\n\nWebGL Overlay View provides a set of hooks that are called at various times in\nthe lifecycle of the WebGL rendering context of the vector basemap. These\nlifecycle hooks are where you setup, draw, and tear down anything you want\nrendered in the overlay.\n\n- **`onAdd()`** is called when the overlay is created. Use it to fetch or create intermediate data structures before the overlay is drawn that don't require immediate access to the WebGL rendering context.\n- **`onContextRestored({gl})`** is called once the rendering context is available. Use it to initialize or bind any WebGL state such as shaders, GL buffer objects, and so on. `onContextRestored()` takes a `WebGLStateOptions` instance, which has a single field:\n - `gl` is a handle to the `WebGLRenderingContext` used by the basemap.\n- **`onDraw({gl, transformer})`** renders the scene on the basemap. The parameters for `onDraw()` is a `WebGLDrawOptions` object, which has two fields:\n - `gl` is a handle to the `WebGLRenderingContext` used by the basemap.\n - `transformer` provides helper functions to transform from map coordinates to model-view-projection matrix, which can be used to translate map coordinates to world space, camera space, and screen space.\n- **`onContextLost()`** is called when the rendering context is lost for any reason, and is where you should clean up any pre-existing GL state, since it is no longer needed.\n- **`onStateUpdate({gl})`** updates the GL state outside of the render loop, and is invoked when `requestStateUpdate` is called. It takes a `WebGLStateOptions` instance, which has a single field:\n - `gl` is a handle to the `WebGLRenderingContext` used by the basemap.\n- **`onRemove()`** is called when the overlay is removed from the map with `WebGLOverlayView.setMap(null)`, and is where you should remove all intermediate objects.\n\nFor example, the following is a basic implementation of all lifecycle hooks: \n\n const webglOverlayView = new google.maps.WebGLOverlayView();\n\n webglOverlayView.onAdd = () =\u003e {\n // Do setup that does not require access to rendering context.\n }\n\n webglOverlayView.onContextRestored = ({gl}) =\u003e {\n // Do setup that requires access to rendering context before onDraw call.\n }\n\n webglOverlayView.onStateUpdate = ({gl}) =\u003e {\n // Do GL state setup or updates outside of the render loop.\n }\n\n webglOverlayView.onDraw = ({gl, transformer}) =\u003e {\n // Render objects.\n }\n\n webglOverlayView.onContextLost = () =\u003e {\n // Clean up pre-existing GL state.\n }\n\n webglOverlayView.onRemove = () =\u003e {\n // Remove all intermediate objects.\n }\n\n webglOverlayView.setMap(map);\n\nResetting GL State\n------------------\n\nWebGL Overlay View exposes the WebGL rendering context of the basemap. Because\nof this, it is extremely important that you reset the GL state to its original\nstate when you are done rendering objects. Failure to reset the GL state is\nlikely to result in GL state conflicts, which will cause rendering of both the\nmap and any objects you specify to fail.\n\nResetting the GL state is normally handled in the `onDraw()` hook. For example,\nThree.js provides a helper function that clears any changes to the GL state: \n\n webglOverlayView.onDraw = ({gl, transformer}) =\u003e {\n // Specify an object to render.\n renderer.render(scene, camera);\n renderer.resetState();\n }\n\nIf the map or your objects fail to render, it is very likely that the GL state\nhas not been reset.\n\nCoordinate Transformations\n--------------------------\n\nThe position of an object on the vector map is specified by providing a\ncombination of latitude and longitude coordinates, as well as altitude. 3D\ngraphics, however, are specified in world space, camera space, or screen space.\nTo make it easier to transform map coordinates to these more commonly used\nspaces, WebGL Overlay View provides the\n`coordinateTransformer.fromLatLngAltitude(latLngAltitude, rotationArr,\nscalarArr)` helper function in the `onDraw()` hook that takes the following and\nreturns a `Float64Array`:\n\n- `latLngAltitude`: Latitude/longitude/altitude coordinates either as a `LatLngAltitude` or `LatLngAltitudeLiteral`.\n- `rotationArr`: `Float32Array` of euler rotation angles specified in degrees.\n- `scalarArr`: `Float32Array` of scalars to apply to the cardinal axis.\n\nFor example, the following uses `fromLatLngAltitude()` to create a camera\nprojection matrix in Three.js: \n\n const camera = new THREE.PerspectiveCamera();\n const matrix = coordinateTransformer.fromLatLngAltitude({\n lat: mapOptions.center.lat,\n lng: mapOptions.center.lng,\n altitude: 120,\n });\n camera.projectionMatrix = new THREE.Matrix4().fromArray(matrix);\n\nExample\n-------\n\nThe following is a simple example of using [Three.js](https://threejs.org), a\npopular, open source WebGL library, to place a 3D object on the map. For a\ncomplete walkthrough of using WebGL Overlay View to build the example you see\nrunning at the top of this page, try the\n[Building WebGL-accelerated Map Experiences codelab](http://goo.gle/maps-platform-webgl-codelab). \n\n const webglOverlayView = new google.maps.WebGLOverlayView();\n let scene, renderer, camera, loader;\n\n webglOverlayView.onAdd = () =\u003e {\n // Set up the Three.js scene.\n scene = new THREE.Scene();\n camera = new THREE.PerspectiveCamera();\n const ambientLight = new THREE.AmbientLight( 0xffffff, 0.75 ); // Soft white light.\n scene.add(ambientLight);\n\n // Load the 3D model with GLTF Loader from Three.js.\n loader = new GLTFLoader();\n loader.load(\"pin.gltf\");\n }\n\n webglOverlayView.onContextRestored = ({gl}) =\u003e {\n // Create the Three.js renderer, using the\n // maps's WebGL rendering context.\n renderer = new THREE.WebGLRenderer({\n canvas: gl.canvas,\n context: gl,\n ...gl.getContextAttributes(),\n });\n renderer.autoClear = false;\n }\n\n webglOverlayView.onDraw = ({gl, transformer}) =\u003e {\n // Update camera matrix to ensure the model is georeferenced correctly on the map.\n const matrix = transformer.fromLatLngAltitude({\n lat: mapOptions.center.lat,\n lng: mapOptions.center.lng,\n altitude: 120,\n });\n camera.projectionMatrix = new THREE.Matrix4().fromArray(matrix);\n\n // Request a redraw and render the scene.\n webglOverlayView.requestRedraw();\n renderer.render(scene, camera);\n\n // Always reset the GL state.\n renderer.resetState();\n }\n\n // Add the overlay to the map.\n webglOverlayView.setMap(map);"]]