Как заставить мои текстуры правильно связываться для мультитекстурирования? - PullRequest
0 голосов
/ 19 декабря 2011

Я пытаюсь сделать цветной текст на экране.У меня есть текстура, содержащая черное (RGBA 0, 0, 0, 255) представление текста для отображения, и у меня есть другая текстура, содержащая цветовой узор, в котором я хочу отобразить текст. Это должно быть довольнопростое мультитекстурное упражнение, но я не могу заставить работать вторую текстуру.Обе текстуры являются текстурами прямоугольника, потому что с целочисленными значениями координат легче работать.

Код рендеринга:

glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, TextHandle);

glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, ColorsHandle);

glBegin(GL_QUADS);
  glMultiTexCoord2iARB(GL_TEXTURE0_ARB, 0, 0);
  glMultiTexCoord2iARB(GL_TEXTURE1_ARB, colorRect.Left, colorRect.Top);
  glVertex2f(x, y);

  glMultiTexCoord2iARB(GL_TEXTURE0_ARB, 0, textRect.Height);
  glMultiTexCoord2iARB(GL_TEXTURE1_ARB, colorRect.Left, colorRect.Top + colorRect.Height);
  glVertex2f(x, y + textRect.Height);

  glMultiTexCoord2iARB(GL_TEXTURE0_ARB, textRect.Width, textRect.Height);
  glMultiTexCoord2iARB(GL_TEXTURE1_ARB, colorRect.Left + colorRect.Width, colorRect.Top + colorRect.Height);
  glVertex2f(x + textRect.Width, y + textRect.Height);

  glMultiTexCoord2iARB(GL_TEXTURE0_ARB, textRect.Width, 0);
  glMultiTexCoord2iARB(GL_TEXTURE1_ARB, colorRect.Left + colorRect.Width, colorRect.Top);
  glVertex2f(x + textRect.Width, y);
glEnd;

Вершинный шейдер:

void main()
{
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
   gl_TexCoord[0] = gl_MultiTexCoord0;
   gl_TexCoord[1] = gl_MultiTexCoord1;
}

Фрагментный шейдер:

uniform sampler2DRect texAlpha;
uniform sampler2DRect texRGB;
void main()
{   
   float alpha = texture2DRect(texAlpha, gl_TexCoord[0].st).a;
   vec3 rgb = texture2DRect(texRGB, gl_TexCoord[1].st).rgb;
   gl_FragColor = vec4(rgb, alpha);
}

Это кажется очень простым, но в конечном итоге он отображает сплошной черный текст вместо цветного.Я получаю точно такой же результат, если последняя строка фрагмента шейдера читает gl_FragColor = texture2DRect(texAlpha, gl_TexCoord[0].st);.Изменение последней строки на gl_FragColor = texture2DRect(texRGB, gl_TexCoord[1].st); приводит к тому, что она вообще ничего не отображает.

Исходя из этого, получается, что вызов texture2DRect для texRGB всегда возвращает (0, 0, 0, 0).Я удостоверился, что GL_MULTISAMPLE включен, и привязал текстуру к блоку 1, но по какой-то причине я, кажется, фактически не получаю доступ к ней внутри моего фрагментного шейдера.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2011

Вы уверены, что текстура шрифта содержит допустимые значения альфа?Вы сказали, что текстура черно-белая, но вы используете альфа-значение!Вместо использования компонента a попробуйте использовать r one.

Смешивание влияет на вывод фрагмента шейдера: он смешивает этот цвет фрагмента с соответствующим.*

0 голосов
/ 19 декабря 2011

Спецодежда выглядит хорошо. Возможно, ваши текстовые координаты для блока 1 испорчены, что приводит к выборке за пределами цветной части вашей текстуры.

Ваша цветная текстура полностью заполнена цветом?

Что вы подразумеваете под "заставляет его вообще ничего не рендерить". ? Этого не должно быть, кроме случаев, когда ваш альфа-канал в цветовой текстуре установлен на 0.

Вы пытались с помощью следующего кода переопределить альфа-канал?

  gl_FragColor = vec4( texture2DRect(texRGB, gl_TexCoord[1].st).rgb, 1.0 );
...