2011-11-11 120 views
5

在視頻遊戲中,僅應用顏色來幫助加速加載過程。紋理準備就緒後,它們會替換當前的顏色。有沒有辦法在WebGL中做到這一點?到目前爲止,我所見過的所有教程只展示瞭如何加載顏色或紋理(而不是一個接一個地加載)。用WebGL中的紋理替換顏色

我猜想每個形狀的緩衝區在其紋理完全加載後需要改變。我會假設這是通過AJAX調用鍵入的,該紋理可用,然後通過某種JavaScript函數應用。沒有複雜的圖像加載過程,WebGL是否有內置的方法?

+0

好吧,幾個月後,我看完自己的問題後,明白我在問什麼。要完全回答我自己的問題,請閱讀下文。 要在同一時間加載紋理和顏色,您需要兩組x-fragment和x-vertex腳本。一個用於顏色,另一個用於紋理。由於它們是通過DOM拉入的,因此您只需在初始化對象時使用正確的着色器標識。可以是顏色或紋理。希望這可以幫助無能的WebGL像我一樣發揚光大。 –

回答

5

在我所見過的大多數遊戲中,您將描述它們的行爲,通常以每頂點着色或非常低分辨率的紋理開始,並在可用時「融合」到完整紋理。這種平穩的過渡是棘手的,但如果你想要的只是從一個到另一個的快速「流行」,它應該不會太麻煩。

我會採取的基本路線是創建一個頂點緩衝區,同時具有紋理座標和顏色信息,以及兩個不同的着色器。一個着色器將使用顏色信息,另一個將忽略它並使用紋理。一旦紋理準備就緒,您就會發信號通知網格開始使用基於紋理的網格。

至於檢測圖像負載,這是不難的,你甚至不需要AJAX吧:

var image = new Image(); 
image.addEventListener("load", function() { 
    // Image is done loading, push to texture 
    gl.bindTexture(gl.TEXTURE_2D, texture); 
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); 
    // Set up any other state needed, such as switching the shader for the mesh 
}, true); 
image.src = src; 

我不知道我能多少幫助,在這個問題上沒有給出發佈非常大的代碼塊,但是如果你還在掙扎,我可以詳細介紹一些其他部分。

+0

遠比我預想的簡單。當你說「兩個不同的着色器」時,你是在談論設置的初始着色器?如果是這樣,我猜測繪圖功能需要在某個點上切換紋理和紋理輸出。 –

+0

我不完全確定「初始着色器」的含義。你在使用特定的教程或框架嗎? – Toji

+0

實際上從零開始構建自己的WebGL引擎,遵循Mozilla WebGL教程中的許多想法和原則。通過初始着色器,我指的是在設置WebGL時(如果我沒有記錯的話),您可以使用它來抓取並存儲着色器元素。 –

0

這實際上很簡單,沒有WebGL專門爲此特別設計的任何功能,這是您可以從DOM API中免費獲得的東西。當你加載圖片時,無論如何你必須實現他們的'onload'回調,因爲圖片加載是異步的。因此,只需在'onload'回調中加入任何代碼即可從純色切換到紋理。

1

我會採取的方法是如下

loadTexture(url, initialColor) { 

    var tex = gl.createTexture(); 

    // start with a single color. 
    gl.bindTexture(gl.TEXTURE_2D, tex); 
    var pixel = new Uint8Array(initialColor); 
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, pixel); 

    // start loading the image 
    var img = new Image(); 
    img.src = url; 
    img.onLoad = function() { 

    // when the image has loaded update the texture.   
    gl.bindTexture(gl.TEXTURE_2D, tex); 
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); 
    gl.generateMipmap(gl.TEXTURE_2D); 
    } 
    return tex; 
} 

// Load a tree texture, use brown until the texture loads. 
var treeTexture = loadTexture("tree.png", [255, 200, 0, 255]); 
// Load a water texture, use blue until it loads. 
var waterTexture = loadTexture("water.jpg", [0, 0, 255, 255]); 

這是怎麼上http://webglsamples.googlecode.com工作大部分樣品,雖然他們都默認爲藍色紋理。

您可以輕鬆地將該想法擴展爲使用純色,加載低分辨率紋理,然後在完成時加載高分辨率紋理。

注意:上面的代碼假定您正在加載2次冪的紋理。如果沒有,你需要正確設置你的紋理參數。