ios - 在 OpenGL ES 中使用 CVOpenGLESTextureCache 将纹理传递给 Uniform

标签 ios opengl-es

我正在尝试使用 CVOpenGLESTextureCache 在 iOS 5.0+ 上的 OpenGL ES 中将视频文件作为纹理应用。

我找到了 Apple 的 RosyWriter示例代码,并一直在阅读它。

我的问题是:

纹理最终是如何传递到片段着色器中的制服的?

在 RosyWriterPreviewView 类中,我一直遵循它

glBindTexture(CVOpenGLESTextureGetTarget(texture), 
               CVOpenGLESTextureGetName(texture))

之后指定一些纹理参数。

但是,我没有看到示例代码明确引用了纹理统一(sampler2D 视频帧)。我已经习惯的纹理发送代码看起来像:
GLint uniform = glGetUniformLocation(program, "u_uniformName");

随后调用实际将纹理发送到制服:
glUniform1i(GLint location, GLint x);

所以我知道 RosyWriter 以某种方式在其片段着色器中将纹理传递给制服,但我看不出它是如何以及在何处发生的。

事实上,示例代码包含构建 OpenGL 程序的注释:
// we don't need to get uniform locations in this example

关于为什么会这样以及如何发送纹理的任何帮助都会很棒。

最佳答案

在 RosyWriter 示例中,我认为他们能够在不使用 glUniformi() 的情况下逃脱的原因随时为videoframe uniform 是它们将输入纹理绑定(bind)到纹理单元 0。

为纹理指定统一值时,您使用的值是纹理绑定(bind)到的纹理单元。如果您不为制服设置值,我相信它应该默认为 0,因此通过将纹理绑定(bind)到单元 0,他们永远不必为 videoframe 设置值。制服。它仍然会拉入附加到单元 0 的纹理。

关于ios - 在 OpenGL ES 中使用 CVOpenGLESTextureCache 将纹理传递给 Uniform,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11566520/

相关文章:

使用移动 pkg 的 Golang 跨平台游戏引擎?

android - Android 上的 OpenGL 与 iOS : optimisations, 以及它们的不同之处

android - 如何在不剪裁基础纹理的情况下将纹理叠加在另一个纹理上?

android - 动感固件更新

ios - 寻找一个 cordova 插件来提示用户

ios - 在动画中点击 UIImage

ios - Swift3:用户输入的实时 UiLabel 更新

ios - 将背景图像保持在动画的中心

opengl - 我是否应该在统一缓冲区或着色器存储缓冲区对象内使用 `vec3`?

opengl - 在OpenGL中使用间接渲染有什么好处?