Я кодирую боевую игру, в которой каждый персонаж имеет большое количество спрайтов, и у каждого персонажа есть несколько разных палитр. Я пытаюсь использовать оттенки серого для каждого спрайта и текстуру 256x1 для каждой палитры.OpenGL Palette Swap shader?
Мои шейдеры выглядеть следующим образом:
Vertex:
varying vec2 coord;
void main(void)
{
coord = gl_MultiTexCoord0.xy;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Фрагмент:
uniform sampler2D palette;
uniform sampler2D texture;
varying vec2 coord;
void main()
{
gl_FragColor = texture2D(palette, vec2(texture2D(texture, coord).r, 0));
}
"палитра" устанавливается в 1 и "текстура" устанавливается на 0 с glGetUniformLocation и glUniform1i. Они компилируют штраф и связывают штраф. Я могу использовать объект программы в своем коде.
Проблема заключается в том, что я понятия не имею, как использовать мультитекстурирование для получения текстур «палитры» и «текстуры», взаимодействующих друг с другом в шейдере. Это мой первый опыт использования мультитекстурирования, и я не могу понять, как заставить его работать для такого решения. Кто-нибудь знает, как с помощью этих шейдеров (если они правильны) имитировать обмен палитры?
EDIT: Вот мой рисунок код прямо сейчас:
glUseProgram(paletteProgram);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, palette);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
glTexCoord2f(w1, h1);
glVertex3f(x1, y1, 0);
glTexCoord2f(w1, h2);
glVertex3f(x1, y2, 0);
glTexCoord2f(w2, h2);
glVertex3f(x2, y2, 0);
glTexCoord2f(w2, h1);
glVertex3f(x2, y1, 0);
glEnd();
glUseProgram(0);
Ваш код кажется правильным (за исключением glEnable (GL_TEXTURE_2D), который не имеет никакого эффекта при использовании шейдера, должен удалить его). Вы независимо подтвердили, что эти текстуры загружены и могут быть отобраны правильно, все мультитекстурирование в сторону? – Tim
Да, я тестировал обе текстуры, и они оба работают правильно независимо от шейдера. –
Хм, я в тупике. В любом случае, все, что я могу предложить, это проверить glGetError, если вы этого не сделали, а также проверить инфологи шейдеров (возможно, это некое неслыханное предупреждение, которое может дать ключ). – Tim