2013-01-21 28 views
1

我問的最後一個問題是關於如何在OpenGL中繪製不同的模型。我已經覆蓋了,但現在我堅持做紋理。我再次可以輕鬆地獲取紋理,只要我只使用一個紋理。OpenGL使用每個模型的特定紋理

加載紋理類:現在

public class Textures 
{ 

    public static int tex, tex2; 

    public static void load() throws IOException 
    { 
     tex = glGenTextures(); 
     tex2 = glGenTextures(); 

     load(tex2, "moreModels/robot.jpg", "jpg"); 
     load(tex, "moreModels/sample.jpg", "jpg"); 
    } 

    public static void load(int tex, String name, String type) throws IOException 
    { 
     glBindTexture(GL43.GL_TEXTURE_2D, tex); 

     glTexParameterIi(GL43.GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
     glTexParameterIi(GL43.GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

     glGenerateMipmap(GL43.GL_TEXTURE_2D); 

     glTexParameterIi(GL43.GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
     glTexParameterIi(GL43.GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); 

     Texture texture = TextureLoader.getTexture(type, ResourceLoader.getResourceAsStream(name)); 

     byte[] pixels = texture.getTextureData(); 

     ByteBuffer buffer = BufferUtils.createByteBuffer(pixels.length); 
     buffer.put(pixels); 
     buffer.flip(); 
     glTexImage2D(GL43.GL_TEXTURE_2D, 0, GL_BGR, texture.getImageWidth(), texture.getImageHeight(), 0, GL_BGR, GL_BYTE, buffer); 
    } 
} 

,我認爲簡單的調用glBindTexture(GL43.GL_TEXTURE_2D,textureID)將改變質地,但沒有。如果我在任何時候調用glBindTexture方法,所有東西都會變成黑色。

是否和以前一樣,每當我需要更改紋理時,都必須執行整個加載方法? (也許保存Texture對象,所以我不必一遍又一遍地加載它)。如果是這樣,當glGenTextures()改變時它忘記了它的一切時有什麼意義?

+1

這是一個想法;在將OpenGL東西封裝在對象中之前,首先使用OpenGL *而不使用*對象。一旦你習慣了那樣,*然後*你可以圍繞它構建你的結構。 –

+0

這是什麼API? JOGL?你能顯示你的片段着色器嗎? –

回答

2

我認爲你對OpenGL texture有一點誤解。你必須記住:每當你加載一個新圖像時,你必須使用你在問題中顯示的例程創建一個新的紋理對象。此外,如果你只需要更新(替換像素)現有紋理,您應該使用glTexSubImage2D。這樣您就不會創建新的紋理對象,而是更新現有紋理對象中的數據。

現在,如果你想有幾個紋理,比如說,一個是彩色貼圖,另一個是普通貼圖,那麼你必須從零開始創建2個貼圖,這些貼圖將被你的片段着色器採樣器訪問。

根據你的代碼,你很難看到你如何做整個設置(渲染循環,着色器)。如果你提供更多的信息,那麼它將有可能進一步幫助你。

+0

我確實有一種感覺,我必須再次完成整個紋理塊。我只是想要確認它是正確的。現在它正在工作,所以我會接受你的答案。 –

+0

請記住,如果您想要加載與您要替換的圖像大小相同的圖像,則不需要創建新的紋理,只需更新當前的紋理即可。 –