Как заменить однородный массив GLSL на 1D текстуру - PullRequest
4 голосов
/ 04 декабря 2010

Я пытаюсь заставить систему местности Ardor3D работать на оборудовании SM3.0.

Текущий фрагментный шейдер GLSL использует единый массив vec2 для передачи массива координат xy в фрагментный шейдер.

Поскольку динамические индексированные однородные массивы работают только на оборудовании SM4.0 +, для его запуска на SM3.0 мне нужно заменить его на 1D-текстуру с плавающей точкой.

Текущий массив выглядит так: uniform vec2 sliceOffset[8];

и доступен следующим образом: vec2 offset = sliceOffset[int(unit)];

У меня большой опыт работы с OpenGL и GLSL, поэтому у меня возникли некоторые проблемы при конвертации.

Пока я сделал это: Создайте 1D текстуру - ширина = 8 - формат = RGBA32F

Создание 1D буфера для текстуры

  • ширина = 8 * 4 = 32 поплавка или 32 * 4 = 32 байта большого размера
  • заполнить буфер float следующим образом:

[x0,y0,0,0,x1,y1,0,0,x2,y2,0,0,x3,y3,0,0,x4,y4,0,0,x5,y5,0,0,x6,y6,0,0,x7,y7,0,0]

Создание 1D сэмплера для текстуры

  • мин фильтр = ближайший, без карт MIP
  • mag фильтр = ближайший
  • режим обтекания = зажим к краю

В GLSL я определяю сэмплер как: uniform sampler1D sliceOffset;

И доступ к нему:

vec2 getSliceOffset(float unit)
{
 float texCoord = (unit * 2.0f + 1.0f) / (2.0f * 8.0f);
 vec2 offset = texture1D(sliceOffset, texCoord);
 return offset;
}

Но он сломан.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

Расчет texCoord правильный.Сначала это сбивало с толку, так как я бы это сделал (юнит + .5) / 8.0, но это то же самое.Вам не нужно писать .rg в конце вашего оператора сэмплера, так как texFetch будет vec4?Я удивлен, что ваш компилятор не жалуется на это.

Попробуйте:

texture1D(sliceOffset, texCoord).rg;
1 голос
/ 04 декабря 2010

Все, что вы показываете, выглядит правильно.«Это сломано» не очень описательно, хотя.Каковы симптомы?

Некоторые вещи, которые вы не показываете, могут быть неправильными:

  • 2 сэмплера, использующих ту же единицу текстуры.данные текстуры (хотя если у вас есть опыт, я сомневаюсь в этом)

Еще одна вещь, которую вы можете попробовать: вместо этого используйте texture2d, просто высота = 1.DX не требует поддержки 1d текстур, поэтому в зависимости от аппаратного обеспечения поддержка opengl может быть эмулирована.Вы можете попытаться избежать такой эмуляции.

...