如何使用OpenGL ES 2.0在iOS上将巨大数组传递给着色器?

如何使用OpenGL ES 2.0在iOS上将巨大数组传递给着色器?,ios,opengl-es,glsl,glsles,Ios,Opengl Es,Glsl,Glsles,我只需要将一个巨大的Int数组(计数1521)传递给我的动画着色器。 首先,我把它当作制服,但它看起来太大了 然后,我发现 我没有足够的声誉发表评论,所以我不得不提出另一个问题。我不熟悉这些API,我尝试了所有API 1D纹理:我找不到任何有效的API 统一缓冲区对象:大多数示例都清晰易懂,但在配备ES 2.0的iOS上不可用 缓冲区纹理:我认为非常接近,但在使用ES 2.0的iOS上,glTexBuffer和GL_TEXTURE_Buffer似乎缺失了 着色器存储缓冲区对象:这是GL 4.3

我只需要将一个巨大的
Int
数组(计数1521)传递给我的动画着色器。 首先,我把它当作制服,但它看起来太大了

然后,我发现 我没有足够的声誉发表评论,所以我不得不提出另一个问题。我不熟悉这些API,我尝试了所有API

  • 1D纹理:我找不到任何有效的API
  • 统一缓冲区对象:大多数示例都清晰易懂,但在配备ES 2.0的iOS上不可用
  • 缓冲区纹理:我认为非常接近,但在使用ES 2.0的iOS上,glTexBuffer和GL_TEXTURE_Buffer似乎缺失了
  • 着色器存储缓冲区对象:这是GL 4.3的功能,对于ES 2.0来说太新了
请帮助我,我只需要访问着色器中的数组

这就是我正在做的:

// i var
GLint *randomArray; 
GLuint _randomArrayTexture;
GLuint _randomArrayUnifrom;

// init texture
randomArray = (GLint*)malloc(1521 * sizeof(GLint)); 
    for (int i=0; i<1521; i++) {
        randomArray[i] = array[i].intValue;
    }

glGenTextures(0, &_randomArrayTexture);
glBindTexture(GL_TEXTURE_2D, _randomArrayTexture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1521, 1, 0, GL_ALPHA, GL_INT, randomArray);
glBindTexture(GL_TEXTURE_2D, 0);

_randomArrayUnifrom = glGetUniformLocation(_program, "randomArray"); // after shader compiled

// before draw
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _randomArrayTexture);
glUniform1i(_randomArrayUnifrom, 1);
glBindTexture(GL_TEXTURE_2D, 0);

// the thing in shader
uniform sampler2D randomArray;
texture2D(randomArray, vec2(0.1, 0.0)); 
// Could I access the texture with real index (not uniformed) such as vec2(1109, 0)
//i变量
闪烁*随机阵列;
胶合随机排列结构;
GLuint _randomArrayUnifrom;
//初始纹理
随机数组=(闪烁*)malloc(1521*sizeof(闪烁));

对于(int i=0;i我建议您使用
glTexImage2D
模拟1D纹理,宽度为数组计数(或下一次二次幂),高度为1。

请确保使用数组在着色器代码中需要做什么。它的大小与顶点相同

  • 1521不是很大
  • 似乎最好的方法是将数组作为顶点数组之一传递
  • 即使传递纹理缓冲区,若要引用着色器中缓冲区的特定索引,也应使用顶点缓冲区
  • 加上

    如果将数组用作随机值,则应在着色器代码中使用基于时间或噪波的自定义random(),但是,我认为您弄错了。似乎您希望使用数组[1521]中的数字控制某些动画,但必须在1/60秒内读取数组[1521]吗

    如果否,则可以每1/60秒(假设为60FPS)以统一的形式给出每个值

    如果是,它可能是39x39噪声网格或其他东西,对吗

    然后应该在着色器中生成这些随机值。 或
    更好的方法是使用纹理[1521]和纹理坐标数组作为一个顶点数组来使用数组[1521]的每个值这就是纹理。

    谢谢,只是CPU中的一些熟的随机数,用于控制着色器中的动画过程。应该类似于全局常量。它们很大,而我将其视为均匀。我现在正尝试使用glTexImage2D进行此操作,但在着色器中无法访问。对吗?glTexImage2D(GL_纹理_2D,0,GL_ALPHA,1521,1,0,GL_ALPHA,GL_INT,随机数组);@iaomw若要访问该值,您应该使用一个顶点作为纹理坐标。刚刚更新了我的答案。您使用哪种动画?如果它是基于时间的身体动画,并且不涉及任何实时图形技术,如修改其他纹理或噪波效果,则不必将整个数组传递到着色器。只需启用它们即可一个接一个。从逻辑上讲,帧被视为39*39个方块,动画应该在每个方块上随机执行一次。我应该确保它们中的每一个都会被执行。所以我在CPU上创建了该数组,以确保它每次都是一个新的部分,并且会按预期完成。@Sung-woo一旦每个部分完成,它应该保持完成状态@Sung@iaomw好的,我明白了,但你不能在opengl es中也使用GL_INT。以下符号值是可以接受的:GL_无符号字节、GL_无符号_SHORT_5_6_5、GL_无符号_SHORT_4_4_4_4和GL_无符号_SHORT_5_5_1。我不知道我的
    glTexImage2D
    代码有什么问题,你能帮我一点忙吗?数组的索引在传递给我之后是否也会统一着色器?