OpenGL ES之如何传输一个超大数组给着色器程序
Posted ╰つ栺尖篴夢ゞ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL ES之如何传输一个超大数组给着色器程序相关的知识,希望对你有一定的参考价值。
一、前言
- 在 OpenGL ES 图形图像处理中,会经常遇到一种情况:如何将一个超大的数组传给着色器程序?目前常用的有三种方式:
-
- 使用将数组加载到 2D 纹理的方式,然后使用 texelFetch 取数据;
-
- 使用 uniform 缓冲区对象,即 UBO;
-
- 使用纹理缓冲区对象,即 TBO。
二、将数组加载到纹理
- 使用将数组加载到纹理的方式来传输大数组,是最容易想到的一种方式。要想精确地换取每个像素的值,这个时候就不能使用采样函数 texture,因为采样函数会涉及归一化、过滤以及插值等复杂操作,基本无法得到某一确切像素的值。
- 这个时候就需要使用纹素获取函数 texlFetch ,texlFetch 是 OpenGL ES 3.0 引入的 API ,它将纹理视为图像,可以精确访问像素的内容,可以类比通过索引来获取数组某个元素的值:
vec4 texelFetch(sampler2D sampler, ivec2 P, int lod)
以上是关于OpenGL ES之如何传输一个超大数组给着色器程序的主要内容,如果未能解决你的问题,请参考以下文章
为啥 glColorPointer 不给三角形着色 - 以及 opengl es 的其他奇怪的东西