Из документации glTexGen ::
void glTexGenfv ( GLenum coord ,
GLenum pname , const GLfloat *params
);
- координат - задает координату текстуры.Должно быть одним из GL_S, GL_T, GL_R или GL_Q.
- pname - Если функция генерации текстуры - GL_OBJECT_LINEAR, функция
g = p1 xo + p2 yo + p3 zo + p4 wo
, где g - значение, вычисленное для координаты, названной в ordin,...
, поэтому g действительно является скалярным значением, которое может быть либо s , либо t компонентом вашего vec2 uvзначение, в зависимости от значения ordin (GL_S или GL_T).
Чтобы быть более явным, вызовы
glTexGen(GL_S, GL_OBJECT_LINEAR, {ps0,ps1,ps2,ps3})
glTexGen(GL_T, GL_OBJECT_LINEAR, {pt0,pt1,pt2,pt3})
аналогичны
vec4 sPlane = vec4(ps0,ps1,ps2,ps3);
vec4 tPlane = vec4(pt0,pt1,pt2,pt3);
kOutBaseTCoord.s = dot(vec4(POSITION, 1.0), sPlane);
kOutBaseTCoord.t = dot(vec4(POSITION, 1.0), tPlane);
В зависимости от масштаба значений POSITION выходные координаты st могут быть вне диапазона (0,1).Используя ваши значения:
vec4 sPlane = vec4(1.0, 0.0, 0.0, 0.0);
vec4 tPlane = vec4(0.0, 1.0, 0.0, 0.0);
будет напрямую отображать x координаты вершин вашей модели в s значения ваших координат текстуры, то же самое для y и т .Таким образом, если ваша модель имеет диапазон координат вне (0,1), значения УФ будут следовать.
Чтобы текстура соответствовала вашей модели, вы должны адаптировать масштаб проекции к размеру вашегомодель.Для примерного размера модели 100.0 это даст следующий код:
float MODEL_SIZE = 100.0;
vec4 sPlane = vec4(1.0/MODEL_SIZE, 0.0, 0.0, 0.0);
vec4 tPlane = vec4(0.0, 1.0/MODEL_SIZE, 0.0, 0.0);
Это решение все равно может дать вам значения <0, если ваша модель центрирована в (0,0,0).Чтобы настроить это, вы можете добавить смещение к результирующим значениям UV.Например: </p>
kOutBaseTCoord.st += vec(0.5);
Обратите внимание, что все это сильно зависит от вашего приложения и того, чего вы пытаетесь достичь с помощью проекции текстуры.Не стесняйтесь корректировать формулы в соответствии с вашими потребностями, для этого и нужны шейдеры!