"целочисленное постоянное переполнение" с GLSL (OpenGL ES2) - PullRequest
1 голос
/ 26 января 2011

Мне нужно передать данные текстуры в шейдерную программу без использования текстур OpenGL, потому что я не использую степень двух текстур, но получаю ошибку с этим фрагментным шейдером.

varying highp vec2 texcoord;
uniform ivec4 texdata[172800];
void main(){
 int pixel = int(360.0 * texcoord.y + texcoord.x);
 gl_FragColor = vec4(texdata[pixel].x,texdata[pixel].y,texdata[pixel].z,1);
}

Как я могу передать эти данные?

Ответы [ 3 ]

4 голосов
/ 26 января 2011

Спецификация OpenGL / ES 2 требует только, чтобы целые числа GLSL были не менее 17 бит (могут представлять диапазон [-2 ^ 16,2 ^ 16)), а целые числа использовались для индексов массива, поэтому вы не можете надежно создать массив из более чем 65535 элементов. Вы, возможно, не сможете создать такой большой в любом случае, поскольку существуют ограничения на общий объем унифицированных данных, которые могут быть намного ниже. Если вы хотите получить доступ к большему количеству данных, вам нужно использовать текстуру.

Эта ошибка, вероятно, исходит от вашей целочисленной константы 172800, которая, по-видимому, слишком велика для реализации вашей платформы GLSL.

2 голосов
/ 27 января 2011

На самом деле, более новые модели iOS, поддерживающие OpenGL ES 2.0, имеют возможность использовать текстуры не-степени двух, потому что это предусмотрено в спецификации OpenGL ES 2.0. Эти устройства также позволяют использовать в OpenGL ES 1.1 текстуры не-степени двух, используя расширение GL_APPLE_texture_2D_limited_npot, которое я более подробно опишу в своем ответе здесь .

Ограничения, которые Apple накладывает на эти текстуры не-степени-двух, заключаются в том, что они не должны быть отображены в виде mip-карт, и они должны использовать GL_CLAMP_TO_EDGE для обтекания:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Я использую такие текстуры в моем примере приложения OpenGL ES 2.0 здесь .

Вам не нужно искать другой способ передачи своих текстур шейдерам на этих устройствах.

0 голосов
/ 26 января 2011

Существуют текстурные цели не в степени 2, так что нет причин делать это.http://www.opengl.org/registry/specs/ARB/texture_rectangle.txt

Или вы просто добавляете данные, не имеющие степени 2, в кадр степени 2.

...