2016-07-05 24 views
3

我發現它令人驚訝的令人沮喪的,它是如此難以找到sampler2d陣列如OpenGL多個Sampler2D(數組)示例?

uniform sampler2D myTextureSampler[5]; 

如何將一個存儲這個統一位置的例子?:

gl.GetUniformLocation(program, "myTextureSampler") 

會一個簡單的使用:

gl.GetUniformLocation(program, "myTextureSampler[0]") 
gl.GetUniformLocation(program2, "myTextureSampler[2]") 

一個如何去使用多重紋理像這樣:

gl.BindTexture(gl.TEXTURE_2D, 1) 
gl.BindTexture(gl.TEXTURE_2D, 2) 

等。

gl.ActiveTexture(gl.TEXTURE0) 
gl.ActiveTexture(gl.TEXTURE1) 

等。

注意:這個代碼是不是純C++的OpenGL。只是尋找關於如何完成的基本概念。

傳遞一個簡單的例子,獲得一個sampler2d數組的統一位置會很好。有沒有人有這方面的經驗?

+0

明顯的答案有什麼問題? GL側的[統一數組工作]方式(https://www.opengl.org/wiki/Uniform_(GLSL)#Uniform_management)不會因爲使用像'sampler2D'這樣的不透明類型而改變。 –

+0

以上都不是答案。他們只是猜測我認爲它會起作用的方式。目前,我沒有太多的成功讓它工作。看起來像一個簡單的方法來獲得簡單的堆棧溢出點,並幫助了很多人:) – efel

回答

2

我相信它是相同的所有其他着色器陣列的訪問和:

glGetUniformLocation(program, "myTextureSampler[0]"); 

會工作。

要使用多重紋理,你應該設置你想要把你的紋理中活躍第一插槽:

glActiveTexture(GL_TEXTURE0); 

,然後你可以綁定你的紋理:

glBindTexture(GL_TEXTURE_2D, texture.handle); 

第二個參數是你從glGenTextures()獲得的句柄。

然後,通過調用匹配合適的紋理sampler2D:

glUniform1i(location, 0); 

第一個參數是你從哪打來GetUniformLocation回來的位置()。 第二個參數是當前紋理槽(在這種情況下爲GL_TEXTURE0)。

+0

所以奇怪的是當我嘗試這個,然後我訪問我的片段着色器myTextureSampler [1],一切正常..應該索引1因爲我將統一位置設置爲索引0,所以拋出一個錯誤?我還沒有嘗試過兩種實際的紋理。也許當你分配myTextureSampler [0]和myTextureSampler [1]時,它會自動填充他們在不同的單位? – efel

+0

@efel這是因爲uniform的默認值已經是'0',所以它默認指向綁定到'GL_TEXTURE0'的紋理。 – Overv