OpenGL/OpenGL ES中的绑定点是什么?

4

我正在学习OpenGL/ES。我不清楚绑定点是什么。我查看了OpenGL文档并在互联网上搜索,但找不到一个很好地解释绑定点的东西。

这里有一个绑定点的例子。

void glUniformBlockBinding( GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);

如果您能解释一下绑定点是什么,它如何使用等等,我将不胜感激。

1个回答

3

统一块绑定点的作用与纹理单元完全相同。

在您的着色器中,您引用一个纹理采样器(例如sampler2D),并通过调用glUniform1i(samplerUniformIndex, textureUnitNumber);将此采样器与纹理单元相关联。在使用着色器进行绘制之前,您需要使用glActiveTexture(设置活动纹理单元)和glBindTexture将纹理绑定到此textureUnitNumber。因此,这里有三个概念:

  1. 绑定点(纹理单元)
  2. 要使用的资源(纹理)
  3. 使用资源的对象(着色器中的采样器统一变量)

统一块的绑定点也是如此。您有:

  1. 统一块绑定点
  2. 要使用的资源。在这种情况下,这是存储统一块数据的缓冲对象。
  3. 使用资源的对象,即着色器中的统一块。

我们可以比较一下纹理和统一缓冲对象的使用方法。

将绑定点与使用资源的对象相关联:

纹理:
GLuint samplerUniformIndex;
glUseProgram(program);
samplerUniformIndex = glGetUniformLocation(program, "mysampler");
glUniform1i(samplerUniformIndex, textureUnitNumber);

统一缓冲区:

GLuint uniformBlockIndex = glGetUniformBlockIndex(program, "myblock");
glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);

将资源与其绑定点关联:

纹理(Texture):

glActiveTexture(textureUnitNumber);
glBindTexture(textureTarget, texture);

统一缓冲区:

glBindBufferBase(GL_UNIFORM_BUFFER, uniformBlockBinding, uniformBuffer);

或者您可以使用glBindBufferRange来绑定一个特定范围的统一缓冲区。


2
你是不是想说 "glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);" 而不是 "glUniformBlockIndex(program, uniformBlockIndex, uniformBlockBinding);"? - Steven2163712

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