1. 程式人生 > >66 - three.js 筆記 - 載入 TGA 格式的紋理

66 - three.js 筆記 - 載入 TGA 格式的紋理

1、TGA格式

TGATarga)格式是計算機上應用最廣泛的圖象格式。
在兼顧了BMP的圖象質量的同時又兼顧了JPEG的體積優勢。
並且還有自身的特點:通道效果方向性
CG領域常作為影視動畫的序列輸出格式,因為兼具體積小和效果清晰的特點。
TGA的結構比較簡單,屬於一種圖形、影象資料的通用格式,在多媒體領域有很大影響,是計算機生成影象向電視轉換的一種首選格式。
TGA影象格式最大的特點是可以做出不規則形狀的圖形、影象檔案,一般圖形、影象檔案都為四方形,若需要有圓形、菱形甚至是縷空的影象檔案時,TGA就可以派上用場了。
TGA格式支援壓縮,使用不失真的壓縮演算法。
PC

遊戲中很多采用TGA格式的圖片,轉換為tga格式用ps就可以了。
可以通過ps開啟以及進行轉換。

2、匯入TGA格式的紋理

2.1、示例

http://ithanmang.com/threeJs/home/201809/20180905/03-basic-texture-tga.html

2.2、效果

這裡寫圖片描述

2.3、引入TGA載入器
<!--匯入 TGA 載入器-->
<script src="../../libs/examples/js/loaders/TGALoader.js"></script>
2.2、例項化載入器
let loader = new THREE.TGALoader();
let
texture = loader.load('../../textures/tga/' + imageUrl, function () { ...... }); let material = new THREE.MeshStandardMaterial(); material.map = texture; let mesh = new THREE.Mesh(geometry, material);

3、示例程式碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"
>
<link rel="icon" href="../../../three.png"> <title>基礎紋理-載入 TGA 格式的紋理</title> <style> body { margin: 0; overflow: hidden; /* 溢位隱藏 */ } #loading { position: fixed; top: 50%; left: 50%; color: #FFFFFF; font-size: 20px; margin-top: -30px; margin-left: -40px; } </style> <script src="../../libs/build/three-r93.js"></script> <script src="../../libs/examples/js/Detector.js"></script> <script src="../../libs/examples/js/libs/dat.gui.min.js"></script> <script src="../../libs/examples/js/libs/stats.min.js"></script> <script src="../../libs/examples/js/controls/OrbitControls.js"></script> <!--匯入 TGA 載入器--> <script src="../../libs/examples/js/loaders/TGALoader.js"></script> </head> <body> <p id="loading">loading......</p> <script> let scene, camera, renderer, controls, guiControls; let stats = initStats(); /* 場景 */ function initScene() { scene = new THREE.Scene(); scene.background = new THREE.Color(0x050505); } /* 相機 */ function initCamera() { camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000); camera.position.set(0, 0, -50); camera.lookAt(new THREE.Vector3(0, 0, 0)); } /* 渲染器 */ function initRender() { renderer = new THREE.WebGLRenderer({antialias: true}); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); } /* 燈光 */ function initLight() { scene.add(new THREE.AmbientLight(0x0c0c0c)); let spotLight1 = new THREE.SpotLight(0xffffff); spotLight1.position.set(-400, -400, -400); let spotLight2 = new THREE.SpotLight(0xffffff); spotLight2.position.set(400, 400, 400); scene.add(spotLight1); scene.add(spotLight2); } /* 控制器 */ function initControls() { /* 地圖控制元件 */ controls = new THREE.OrbitControls(camera, renderer.domElement); /* 屬性引數 */ } /* 除錯外掛 */ function initGui() { guiControls = new function () { }; let gui = new dat.GUI(); } /* 場景中的內容 */ let sphere; let box; function initContent() { sphere = createMesh(new THREE.SphereGeometry(5, 20, 20), 'crate_color8.tga'); box = createMesh(new THREE.BoxGeometry(7, 7, 7), 'crate_grey8.tga'); box.translateX(7); sphere.translateX(-7); scene.add(sphere); scene.add(box); } /* 移除載入元素 */ function removeLoading() { document.getElementById('loading').style.display = 'none'; } /* 建立帶有紋理的網格 */ function createMesh(geometry, imageUrl) { let loader = new THREE.TGALoader(); let texture = loader.load('../../textures/tga/' + imageUrl, function () { removeLoading(); }); let material = new THREE.MeshStandardMaterial(); material.map = texture; let mesh = new THREE.Mesh(geometry, material); return mesh; } /* 效能外掛 */ function initStats() { let stats = new Stats(); document.body.appendChild(stats.domElement); return stats; } /* 視窗變動觸發 */ function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); } /* 資料更新 */ function update() { stats.update(); controls.update(); if (sphere) { sphere.rotateY(0.01); } if (box) { box.rotateY(0.01); } } /* 初始化 */ function init() { if (!Detector.webgl) Detector.addGetWebGLMessage(); initScene(); initCamera(); initRender(); initLight(); initControls(); initContent(); initGui(); /* 監聽事件 */ window.addEventListener('resize', onWindowResize, false); } /* 迴圈渲染 */ function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); update(); } /* 初始載入 */ (function () { console.log("three init start..."); init(); animate(); console.log("three init end..."); })(); </script> </body> </html>