如何使用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
代码有什么问题,你能帮我一点忙吗?数组的索引在传递给我之后是否也会统一着色器?