-
Пытаюсь выполнить запись в текстуру
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. Как преодолеть это ограничение?
-
и сразу ещё один вопрос
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, чтение первого текселя происходит неверно. Почему так может быть?
-
> Судя по результатам значения считываемые из текстуры не > выходят за диапазон 0..1. Как преодолеть это ограничение?
Никак. Значение одной компоненты не может быть меньше 0 и больше 1.
> При ширине текстуры более 1, чтение первого текселя происходит > неверно. Почему так может быть?
Из-за фильтрации?
-
1. Хорошо, в принципе просто выполнил масштабирование с переносом и проблемы как бы нет. 2. Судя по всему действительно из-за фильтрации. Однако непонятно. В режиме GL_NEAREST не попадает на второе значение (в текстурных координатах 0.5), получается только в GL_LINEAR
-
Всё я в тупике. Через текстуру данные передаются как байты, т.е. я не могу в одной компоненте передать больше 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!
-
Если карточка позволяет - используй float текстуры без всяких преобразований: glTexImage1D(....., GL_RGBA32F_ARB, GL_FLOAT, @data);
-
Отлично! Спасибо. Однако окончательная версия такова: glTexImage1D(GL_TEXTURE_1D,0,GL_RGBA32F_ARB,4,0,GL_RGBA,GL_FLOAT,@TextureAbl);
-
Правда теперь всё начало жутко тормозить, на отрисовку одного кадра уходит больше секунды, меняю тип internalformat и всё начинает рисоваться быстро. Никто с таким не сталкивался?
-
С GL_RGBA16F_ARB быстро работает. Сразу скажу что видео 7900GS драйвера ForceWare 175.16 стандартные. Сегодня вечером попробую дома на 8800.
|