glTexGen в OpenGL ES 2.0 - PullRequest
       39

glTexGen в OpenGL ES 2.0

1 голос
/ 21 февраля 2011

Я пытался в течение нескольких часов реализовать замену GLSL для glTexGen с GL_OBJECT_LINEAR.Для OpenGL ES 2.0.В Ogl GLSL есть gl_TextureMatrix, которая делает это проще, но недоступна в OpenGL ES 2.0 / OpenGL ES Shader Language 1.0

Некоторые сайты упоминали, что это должно быть "легко" сделать в GLSL vert shader,Но я просто не могу заставить его работать.

Я догадываюсь, что не правильно настраиваю самолеты, или мне что-то не хватает в моем понимании.

Я порычерез Интернет.Но большинство сайтов говорят о проектируемых текстурах, я просто хочу создать ультрафиолетовые лучи на основе плоской проекции.Модели строятся в Maya, имеют полигоны по 50 тыс., А разработчик моделей использует картографирование, но Maya не будет экспортировать UV.Поэтому я пытаюсь это выяснить.

Я посмотрел информацию о man-странице glTexGen:

g = p1xo + p2yo + p3zo + p4wo

Что такое g?Является ли g значением s в вызове texture2d?

Я смотрел на сайте:

http://www.opengl.org/wiki/Mathematics_of_glTexGen

Другой размер объясняет ту же функцию:

ordin = P1 * X + P2 * Y + P3 * Z + P4 * W

Я не понимаю, как координаты (UV VEC2 в моем уме) равна точечному произведению (скалярзначение)?Та же проблема, что у меня была раньше с "g".

Какой я должен установить плоскость?В моем коде opengl c ++ 3.0 я установил [0, 0, 1, 0] (в основном это единица z), и glTexGen прекрасно работает.

Я все еще что-то упускаю.

МойВерт шейдер выглядит в основном так: WVPMatrix = World View Project Matrix.POSITION - позиция вершины модели.

varying vec4 kOutBaseTCoord;
void main()
{
    gl_Position = WVPMatrix * vec4(POSITION, 1.0);

    vec4 sPlane = vec4(1.0, 0.0, 0.0, 0.0);
    vec4 tPlane = vec4(0.0, 1.0, 0.0, 0.0);
    vec4 rPlane = vec4(0.0, 0.0, 0.0, 0.0);
    vec4 qPlane = vec4(0.0, 0.0, 0.0, 0.0);

    kOutBaseTCoord.s = dot(vec4(POSITION, 1.0), sPlane);
    kOutBaseTCoord.t = dot(vec4(POSITION, 1.0), tPlane);
    //kOutBaseTCoord.r = dot(vec4(POSITION, 1.0), rPlane);
    //kOutBaseTCoord.q = dot(vec4(POSITION, 1.0), qPlane);

}

Шейдер фрагмента

precision mediump float;
uniform sampler2D BaseSampler;
varying mediump vec4 kOutBaseTCoord;
void main()
{

    //gl_FragColor = vec4(kOutBaseTCoord.st, 0.0, 1.0);
    gl_FragColor = texture2D(BaseSampler, kOutBaseTCoord.st);
}

Я пробовал texture2DProj в шейдере фрагмента

Вот некоторые другие ссылки, которые япосмотрел

http://www.gamedev.net/topic/407961-texgen-not-working-with-glsl-with-fixed-pipeline-is-ok/

Заранее спасибо.

1 Ответ

3 голосов
/ 21 февраля 2011

Из документации 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);

Обратите внимание, что все это сильно зависит от вашего приложения и того, чего вы пытаетесь достичь с помощью проекции текстуры.Не стесняйтесь корректировать формулы в соответствии с вашими потребностями, для этого и нужны шейдеры!

...