OpenGL多个Sampler2D(数组)示例?

8

我发现很令人意外的是,如此难以找到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)

etc..

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

注意:这段代码并不是纯的C++ OpenGL。只是想了解基本概念上如何完成。 传递、获取sampler2d数组的uniform位置的简单示例将会很好。有经验的人能帮我吗?

1
显而易见的答案有什么问题吗?从GL方面来看,像sampler2D这样的不透明类型使用统一数组的方式并没有改变。 - Nicol Bolas
以上并不是答案,它们只是我认为可能有效的猜测。目前为止,我在使其正常运行方面并没有取得太大成功。这似乎是一个非常简单直接的方式来获得轻松的堆栈溢出积分,并帮助很多人 :) - efel
2个回答

5

我认为它与所有其他着色器数组访问相同,即:

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

将起作用。

使用多个纹理时,您应该首先设置要放置纹理的插槽为活动状态:

glActiveTexture(GL_TEXTURE0);

接下来你可以绑定你的纹理:

glBindTexture(GL_TEXTURE_2D, texture.handle);

第二个参数是您从glGenTextures()获得的句柄。

然后通过调用以下方法将sampler2D与适当的纹理匹配:

glUniform1i(location, 0);

第一个参数是调用 glGetUniformLocation() 后返回的位置。

第二个参数是活动纹理槽(在这种情况下为 GL_TEXTURE0)。


所以奇怪的是,当我尝试这样做并在我的片段着色器中访问myTextureSampler[1]时,一切都正常。既然我将统一位置设置为索引0,那么索引1应该会抛出错误吗?我还没有在两个实际纹理上尝试过。也许当你分配myTextureSampler[0]和myTextureSampler[1]时,它会自动将它们填充为单独的单元? - efel
1
@efel 这是因为 uniform 的默认值已经是 0,所以它默认引用绑定到 GL_TEXTURE0 的纹理。 - Overv

3

当前答案已经存在很长时间,但是不正确。

你正在使用的是统一数组。

对于像这样的着色器声明:

您可以获取数组的统一位置,而不必指定下标:

glGetUniformLocation(my_uniform, "myTextureSampler");

然后,从数组中一次性设置其值:

GLfloat values[5] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
glUniform1fv(my_uniform, 5, values);

文档:https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUniform.xhtml

该文档介绍了OpenGL中的glUniform函数。这个函数用于向着色器程序发送统一变量值。统一变量是在所有的着色器阶段(顶点、片元等)中都可见的变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接