Перевод GLSL во фрагментном шейдере работает не так, как ожидалось

#c #opengl #glsl #shader #fragment-shader

#c #opengl #glsl #шейдер #фрагмент-шейдер

Вопрос:

Я написал простой шейдер GLSL, который создает шаблон, похожий на шаблон цветных квадратов, показанный на этой странице. Затем я добавил код для перемещения шаблона по экрану, следуя этому примеру. Это мой код:

 st = vec3(TexCoord.x , TexCoord.y , 0.0);
vec3 translate = vec3(cos(u_time),sin(u_time), 0.0);
st = translate * 0.1;
st = fract(st * 10);

color = vec3(st.x,st.y,1.0);
 

Все работает нормально, и шаблон перемещается круговым движением вокруг начала координат. Проблема возникает, когда я хочу переместить текстуру, не используя, например, u_time. Если я хочу переместить текстуру на 5 единиц в направлении x и на 2 единицы в направлении y. Я попробовал следующий код:

 st = vec3(TexCoord.x , TexCoord.y , 0.0);
vec3 translate = vec3(5,2, 0.0); //This line is different
st = translate * 0.1;
st = fract(st * 10);

color = vec3(st.x,st.y,1.0);
 

Но текстура вообще не перемещается, когда я делаю это таким образом, и использование больших значений только растягивает текстуру в направлении (если x = 5000000, текстура растягивается в направлении x).

Мой вопрос в том, почему это происходит и как я могу это исправить?

С уважением.

Ответ №1:

Вам нужно сдвинуть координаты текстуры на смещение <1.0:

vec3 translate = vec3(5,2, 0.0);

 vec3 translate = vec3(0.5, 0.2, 0.0);
 

Координаты текстуры находятся в диапазоне [0.0, 1.0]. Перевод текстуры на целое число, кратное 1, имеет тот же эффект, что и перевод текстуры на 0.0.
Обратите внимание, что результат функций sin and cos находится в диапазоне [-1.0, 1.0].