2012-07-03 73 views
9

我在我的遊戲中有一個房子模型,我有一些房子幾何的材料。房子的牆壁有材料,我有一張紋理貼圖來顯示磚塊。如何重複像GL_REPEAT那樣的紋理貼圖?

var mat = new THREE.MeshPhongMaterial({ 
    ambient: 0x969696, 
    map: THREE.ImageUtils.loadTexture('textures/G/G0.jpg'), 
    overdraw: true,combine: THREE.MultiplyOperation 
}); 

在上面這種方式,紋理貼圖看起來像GL_CLAMP我想讓它顯示像GL_REPEAT

我該怎麼辦?

如果看不到圖像檢查this

回答

4

那裏叫做THREE.RepeatWrappingloadTexture默認爲THREE.ClampToEdgeWrapping(請參閱上一鏈接的ctor函數)。不知道你是否可以使用callback(因爲JS中的this有點奇怪(看起來像指向創建的Image,而不是創建的Texture))。簽名:

loadTexture: function (path, mapping, callback) { 

你更好僅舉紋理本地和手動設置包裝模式:

var t = THREE.ImageUtils.loadTexture('textures/G/G0.jpg'); 
t.wrapS = t.wrapT = THREE.RepeatWrapping; 

看起來你不是不看實際的代碼threejs去遠處...

+0

我試着設置wrapS和wrapT那樣,但它不起作用。我認爲也許材料是錯誤的,現在我使用MeshPhongMaterial,我應該使用ShaderMaterial嗎? – user1497753

+0

不知道,我盡力讓這個工作。紋理必須是二的冪次,請參見[WebGLRenderer,l。 5721](https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLRenderer.js)。 –

+0

我有一個類似的問題,我縮放了一個立方體,並且紋理被拉伸了。爲了防止這種情況,你需要在'render()'中設置新的多維數據集大小:'texture.repeat.set(2 * cWidth,2 * cHeight);'(然後紋理的行爲像一個未縮放的模式)。希望有所幫助。 –

13

我已經發布了一個完整的工作示例在: http://stemkoski.github.com/Three.js/Texture-Repeat.html

的代碼示例的相關部分是:

// for example, texture repeated twice in each direction 
var lavaTexture = THREE.ImageUtils.loadTexture('images/lava.jpg'); 
lavaTexture.wrapS = lavaTexture.wrapT = THREE.RepeatWrapping; 
lavaTexture.repeat.set(2, 2); 
var lavaMaterial = new THREE.MeshBasicMaterial({ map: lavaTexture }); 
var lavaBall = new THREE.Mesh(THREE.GeometryUtils.clone(sphereGeom), lavaMaterial); 
scene.add(lavaBall);  
+0

非常感謝!我已經知道如何在立方體和球體上重複紋理。但是我又得到了另一個問題:如何在幾何體的材質上重複紋理?我在遊戲中加載了一些模型,模型的幾何體有一些材料,他們每個人都有不同的紋理圖像,所以你可以給我一些建議或例子嗎?謝謝! – user1497753

+1

我已經得到它了。它也是一樣的!我正在使用的圖像大小爲120 * 120,我將它改爲128 * 128,這樣問題就解決了!也許圖像的大小必須在128 * 128或256 * 256或者如果您想要看到'重複' – user1497753

+4

是的,爲了使重複功能正常工作,圖像尺寸必須是2的冪。 –

3

圖片必須是8×8,16×16×64,32×32,16×64,128×128,256×256,512×512等 和所有一起工作。 =)

+1

包裝要求圖像爲冪級(POT),但它們不必是方形的。 – WestLangley

+0

@WestLangley你的意思是一個8x512也可以工作? – fuchs777

+1

@ fuchs777這是正確的。 – WestLangley