Индексирование массива в фрагментном шейдере - PullRequest
0 голосов
/ 10 января 2011

Это мой первый пост, и я только недавно начал программировать для Android и OpenGl, поэтому будьте добры ко мне:)

Я пишу небольшое приложение, которое будет включать один экран, который будет использоватьизображение в палитре для быстрого изменения цвета.Для скорости я думал, что смогу внедрить систему с помощью шейдера, поэтому у меня есть шейдер, настроенный и работающий на фантастических примерах из руководства по программированию Open GL ES 2.0.Проблема, над которой я бился в течение последних нескольких дней, заключается в способе ссылки на данные моей палитры в шейдере.

Мой шейдер в настоящее время:

precision lowp float;
varying vec2      v_texCoord;
uniform sampler2D s_texture;
uniform int       s_palette[204];  // Specify a palette of 64 rgb entries

void main()
{
   vec4 col = texture2D( s_texture, v_texCoord );
   int index = (int(col.r * 255.0) * 3;

   gl_FragColor = vec4(float(s_palette[index]) / 255.0, float(s_palette[index+1]) / 255.0,  float(s_palette[index+2]) / 255.0, 1.0);
}

Поработав с этим целую вечность и не углубившись далеко, я обнаружил, что если я буду ссылаться на данные своей палитры по постоянному значению, я могу получить результаты, но не путем обращения к переменной.Поискав некоторое время с Google, я обнаружил, что это было именно так, как это было с GLSL 1.1 и было исправлено с GLSL 1.3.Я считаю, что Android работает на GLSL ES1.0, который основан на GLSL 1.3, поэтому он должен работать, но я не могу заставить его работать.Я не могу найти в спецификациях GLSLES ничего такого, что указывало бы на то, что это также невозможно, поэтому где я ошибаюсь?

Если это просто невозможно, то у кого-нибудь есть другие идеи, как обойти это?этот довольно серьезный недостаток в моем плане?

1 Ответ

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

Нет, постоянные массивы не могут индексироваться переменными, но вы можете легко выполнить поиск палитры, используя текстуры вместо массива постоянных данных. Используйте 2D текстуру Nx1 и выполните поиск с использованием texture2D в GLSL.

Конечно, вам нужно будет загрузить данные текстуры со стороны процессора, используя обычные функции текстур в OpenGL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...