Странное мигание при прокрутке текстовых координат процедурно сгенерированной текстуры - PullRequest
0 голосов
/ 30 сентября 2019

Сгенерированная процедурно текстура выглядит нормально, пока я не начну пытаться прокручивать координаты текстуры, используя GL_REPEAT. Если я прокручиваю только нормальное изображение, которое я загрузил, то оно прокручивается нормально. Но процедурный делает этот странный, периодический проблесковый эффект. Я пытаюсь создать звездное поле, так что это просто белые точки на прозрачном фоне, и с этой проблемой звезды становятся почти черными, затем снова белыми и так далее. Кроме того, если я генерирую значительное количество звезд, есть несколько, которые не проявляют такого поведения, но кажутся нормальными.

здесь я просто настраиваю текстуру для opengl и устанавливаю массив пикселей.

glBindTexture(GL_TEXTURE_2D,tex_id);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
GLubyte *pixels=new GLubyte[(screen_width)*(screen_height)*4];

здесь я настраиваю свои генераторы случайных чисел и заполняю данные пикселей для количества звезд, которые я хочу.

irngX=new IRNG(0,screen_width-1);
irngY=new IRNG(0,screen_height-1);
for (int i=0; i<count; ++i){
        int x=irngX->get();
        int y=irngY->get();
        int pos=(y*screen_width*4)+(x*4);
        pixels[pos++]=(GLubyte)255;
        pixels[pos++]=(GLubyte)255;
        pixels[pos++]=(GLubyte)255;
        pixels[pos++]=(GLubyte)255;
}

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

glPixelStorei(GL_UNPACK_ALIGNMENT,1); // ?? 
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,screen_width,screen_height,0,
             GL_RGBA,GL_UNSIGNED_BYTE,pixels);
glPixelStorei(GL_UNPACK_ALIGNMENT,4);

вот мой текстовый скроллер координат:

tex_scroller+=0.001f;
glUniform1f(tex_scroller_loc,tex_scroller);

и в шейдере:

vtex.t+=tex_scroller;

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

1 Ответ

0 голосов
/ 30 сентября 2019

Проблема, вероятно, связана с выборкой текстур. Ваши звезды имеют размер только одного текселя, и при прокрутке сетка пикселов экрана больше не выровнена идеально с сеткой текселей, поэтому происходит фильтрация текстур (GL_LINEAR), которая влияет на яркость. Это особенно проблема, потому что ваши прозрачные тексели, предположительно, черные. Некоторые предложения:

  • Попробуйте изменить 'GL_LINEAR' на 'GL_NEAREST' в приведенном выше коде. Это должно исправить любое замирание, но может заменить его мерцанием вкл / выкл.
  • Попробуйте сделать прозрачный тексель белым, что улучшит ситуацию.
  • Попробуйте изменить tex_scroller+=0.001f; на tex_scroller+=1.0f/screen_width;чтобы убедиться, что вы можете сохранить выравнивание сетки текселей и сетки пикселей
  • Попробуйте изменить размер звездочек на несколько текселей вместо одного текселя.
...