2016-07-05 25 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