3

我正在学习 OpenGL/ES。我不清楚什么是绑定点。我查看了 OpenGL 文档,也搜索了 Internet,但找不到可以很好地解释绑定点的内容。

这是我所说的绑定点的一个例子。

无效glUniformBlockBinding(GLuint程序,GLuint uniformBlockIndex,GLuint uniformBlockBinding);

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

谢谢你。

4

1 回答 1

2

统一块绑定点的行为方式与纹理单元完全相同。

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

  1. 绑定点(纹理单元)
  2. 要使用的资源(纹理)
  3. 使用资源的东西(着色器中的采样器制服)

统一块的绑定点是相同的。你有:

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

我们可以比较如何使用纹理和统一缓冲区对象。

使用资源将绑定点与事物相关联:

纹理:

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

统一缓冲区:

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

将资源与其绑定点相关联:

纹理:

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

统一缓冲区:

glBindBufferBase(GL_UNIFORM_BUFFER, uniformBlockBinding, uniformBuffer);

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

于 2015-09-11T13:48:42.873 回答