Конференция "Игры" » ограничение на диапазон значений в текстуре (OpenGL, шейдеры) [Delphi, Windows]
 
  • CrytoGen (09.06.08 14:08) [0]
    Пытаюсь выполнить запись в текстуру

    TextureAbl[0]:=-1; TextureAbl[1]:=0; TextureAbl[2]:=0; TextureAbl[3]:=0; glTexImage1D(GL_TEXTURE_1D,0,3,1,0,GL_RGB,GL_FLOAT,@TextureAbl);


    и последующее использование этих значений во пиксельном шейдере

      apos=texture1D(abls,0);            
      if (distance(cpos,apos)<rad)
       c = abl_color * ambient_intensity * d;        
      else  
       c = ambient_color * ambient_intensity * d;


    Судя по результатам значения считываемые из текстуры не выходят за диапазон 0..1. Как преодолеть это ограничение?
  • CrytoGen (09.06.08 14:35) [1]
    и сразу ещё один вопрос

    glBindTexture(GL_TEXTURE_1D,texture[0]);
    TextureCut[0]:=0; TextureCut[1]:=1; TextureCut[2]:=0; TextureCut[3]:=0;
    TextureCut[4]:=1; TextureCut[5]:=0; TextureCut[6]:=0; TextureCut[7]:=0;
    glTexImage1D(GL_TEXTURE_1D,0,4,1,0,GL_RGBA,GL_FLOAT,@TextureCut);




    uniform sampler1D cuts;
    void main()
    {
      vec4 cut;
      cut=texture1D(cuts,0);  
      if (dot(pos,cut)>0.0)
       discard;


    При ширине текстуры более 1, чтение первого текселя происходит неверно. Почему так может быть?
  • @!!ex © (09.06.08 15:01) [2]
    > Судя по результатам значения считываемые из текстуры не
    > выходят за диапазон 0..1. Как преодолеть это ограничение?

    Никак. Значение одной компоненты не может быть меньше 0 и больше 1.


    > При ширине текстуры более 1, чтение первого текселя происходит
    > неверно. Почему так может быть?

    Из-за фильтрации?
  • CrytoGen (10.06.08 08:41) [3]
    1. Хорошо, в принципе просто выполнил масштабирование с переносом и проблемы как бы нет.
    2. Судя по всему действительно из-за фильтрации. Однако непонятно. В режиме GL_NEAREST не  попадает на второе значение (в текстурных координатах 0.5), получается только в GL_LINEAR
  • CrytoGen (11.06.08 10:35) [4]
    Всё я в тупике.
    Через текстуру данные передаются как байты, т.е. я не могу в одной компоненте передать больше 256 градаций, а мне нужно передавать координаты, т.е. градаций должно быть больше 256.
    Попробовал разбить так чтобы в одном пикселе передавать в трёх компонентах одну координату:

    x:=0;y:=1;z:=0;
    x:=x*256;y:=y*256;z:=z*256;
    TextureAbl[ 0]:=Trunc(x) shr 16; TextureAbl[ 1]:=Trunc(x) shr 8; TextureAbl[ 2]:=Trunc(x);
    TextureAbl[ 3]:=Trunc(y) shr 16; TextureAbl[ 4]:=Trunc(y) shr 8; TextureAbl[ 5]:=Trunc(y);
    TextureAbl[ 6]:=Trunc(z) shr 16; TextureAbl[ 7]:=Trunc(z) shr 8; TextureAbl[ 8]:=Trunc(z);
    glTexImage1D(GL_TEXTURE_1D,0,3,4,0,GL_RGB,GL_BYTE,@TextureAbl);
    glGetTexImage(GL_TEXTURE_1D,0,GL_RGB,GL_BYTE,@TextureCut2); // проверяю что записалось в текстуру


    в шейдере пытаюсь преобразовать значения обратно:

      vec3 apos = vec3(0.0,0.0,0.0);
      ivec3 avec;
      avec=texture1D(abls,0/4);      
      apos.x=avec.x*256.0+avec.y+avec.z/256.0;  
      avec=texture1D(abls,1/4);  
      apos.y=avec.x*256.0+avec.y+avec.z/256.0;
      avec=texture1D(abls,2/4);  
      apos.z=avec.x*256.0+avec.y+avec.z/256.0;


    Но судя по результатам работы, получаю везде 0!
  • Sergio666 © (11.06.08 14:54) [5]
    Если карточка позволяет - используй float текстуры без всяких преобразований:
    glTexImage1D(....., GL_RGBA32F_ARB, GL_FLOAT, @data);
  • CrytoGen (16.06.08 08:39) [6]
    Отлично! Спасибо.
    Однако окончательная версия такова:
    glTexImage1D(GL_TEXTURE_1D,0,GL_RGBA32F_ARB,4,0,GL_RGBA,GL_FLOAT,@TextureAbl);
  • CrytoGen (16.06.08 09:03) [7]
    Правда теперь всё начало жутко тормозить, на отрисовку одного кадра уходит больше секунды, меняю тип internalformat и всё начинает рисоваться быстро. Никто с таким не сталкивался?
  • CrytoGen (16.06.08 09:10) [8]
    С GL_RGBA16F_ARB быстро работает.
    Сразу скажу что видео 7900GS драйвера ForceWare 175.16 стандартные. Сегодня вечером попробую дома на 8800.
 
Конференция "Игры" » ограничение на диапазон значений в текстуре (OpenGL, шейдеры) [Delphi, Windows]
Есть новые Нет новых   [134430   +2][b:0][p:0.002]