ios - 如何使用 OpenGL ES 2.0 将巨大的数组传递给 iOS 上的着色器?
<p><p>我只需要将一个巨大的 <code>Int</code> 数组(计数 1521)传递给我的动画着色器。
首先,我把它当作制服,但它似乎太大了。</p>
<p>然后,我发现<a href="https://stackoverflow.com/questions/7954927/glsl-passing-a-list-of-values-to-fragment-shader" rel="noreferrer noopener nofollow">Passing a list of values to fragment shader</a>
我没有足够的声誉发表评论,所以我不得不提出另一个问题。我对那些API不熟悉,我都试过了</p>
<ul>
<li>1D 纹理:我找不到任何有效的 API。</li>
<li>统一缓冲区对象:大多数示例都清晰易懂,但在带有 ES 2.0 的 iOS 上不可用</li>
<li>缓冲区纹理:我认为它非常接近,但在带有 ES 2.0 的 iOS 上似乎缺少 glTexBuffer 和 GL_TEXTURE_BUFFER</li>
<li>着色器存储缓冲区对象:这是 GL 4.3 的东西,对于 ES 2.0 来说太新了</li>
</ul>
<p>请帮帮我,我只需要在着色器中访问该数组。</p>
<p>这就是我正在做的:</p>
<pre><code>// i var
GLint *randomArray;
GLuint _randomArrayTexture;
GLuint _randomArrayUnifrom;
// init texture
randomArray = (GLint*)malloc(1521 * sizeof(GLint));
for (int i=0; i<1521; i++) {
randomArray = array.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)
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>我建议您使用 <code>glTexImage2D</code> 模拟一维纹理,其宽度为数组计数(或二的下一个幂),高度为 1。</p></p>
<p style="font-size: 20px;">关于ios - 如何使用 OpenGL ES 2.0 将巨大的数组传递给 iOS 上的着色器?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/33673414/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/33673414/
</a>
</p>
页:
[1]