我只需要将一个巨大的 Int 数组(计数 1521)传递给我的动画着色器。
首先,我把它当作制服,但它似乎太大了。
然后,我发现Passing a list of values to fragment shader
我没有足够的声誉发表评论,所以我不得不提出另一个问题。我对那些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)
Best Answer-推荐答案 strong>
我建议您使用 glTexImage2D 模拟一维纹理,其宽度为数组计数(或二的下一个幂),高度为 1。
关于ios - 如何使用 OpenGL ES 2.0 将巨大的数组传递给 iOS 上的着色器?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/33673414/
|