opengl - OpenGL/OpenGL ES 中的绑定(bind)点是什么?

标签 opengl opengl-es-2.0 opengl-es-3.0

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

以下是我所说的绑定(bind)点含义的示例。

void glUniformBlockBinding( GLuint 程序, GLuint 统一 block 索引, GLuint uniformBlockBinding);

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

最佳答案

统一 block 绑定(bind)点的作用与纹理单元完全相同。

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

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

统一 block 的绑定(bind)点是相同的。你有:

  1. 统一的 block 绑定(bind)点
  2. 要使用的资源。在本例中,这是存储统一 block 数据的缓冲区对象。
  3. 使用资源的事物,即着色器中的统一 block 。

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

将绑定(bind)点与使用资源的事物关联起来:

纹理:

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

统一缓冲区:

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

将资源与其绑定(bind)点关联起来:

纹理:

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

统一缓冲区:

glBindBufferBase(GL_UNIFORM_BUFFER, uniformBlockBinding, uniformBuffer);

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

关于opengl - OpenGL/OpenGL ES 中的绑定(bind)点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32511552/

相关文章:

c++ - Valgrind 在 ATI 上运行 opengl 程序时报告很多错误 - 我应该担心吗?

android-emulator - OpenGL ES 2.0 支持安卓吗?

android - fragment 着色器的标准衍生品(dFdx、dFdy)在 Android 4.4 中无法正常运行

java - OpenGL ES 3.0 中的粒子系统优化

c++ - 在 Assets 管理器中高效使用 c++11 shared_ptr

c - 具有不需要的颜色的纹理

c++ - 反转 y 轴,并在 OpenGL 中设置坐标系

android opengl es 2.0 纹理切换

ios - OpenGL ES 2.0 纹理不会显示

android - OpenGL ES 3.0 半浮点 (R16F) 纹理