2012-05-30 2 views
3

Я кодирую боевую игру, в которой каждый персонаж имеет большое количество спрайтов, и у каждого персонажа есть несколько разных палитр. Я пытаюсь использовать оттенки серого для каждого спрайта и текстуру 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); 
+0

Ваш код кажется правильным (за исключением glEnable (GL_TEXTURE_2D), который не имеет никакого эффекта при использовании шейдера, должен удалить его). Вы независимо подтвердили, что эти текстуры загружены и могут быть отобраны правильно, все мультитекстурирование в сторону? – Tim

+0

Да, я тестировал обе текстуры, и они оба работают правильно независимо от шейдера. –

+0

Хм, я в тупике. В любом случае, все, что я могу предложить, это проверить glGetError, если вы этого не сделали, а также проверить инфологи шейдеров (возможно, это некое неслыханное предупреждение, которое может дать ключ). – Tim

ответ

1

Ваша логика кажется звук. Вам нужно установить активную текстуру с помощью glActiveTexture, а затем привязать текстуру как обычно (для текстурных единиц 0 и 1). Теперь также привяжите значения 0 к равномерной текстуре и 1 к равномерной названной палитре.

Внутри GLSL вы можете использовать texture2D для извлечения текселей из соответствующего сэмплера.

Надеюсь, это поможет!

Это подробно объясняется здесь в this Учебник NeHe (раздел: Использование текстур с GLSL).

Это то, что вам нужно сделать

glUseProgramObject(my_program); 
    int my_sampler_uniform_location = glGetUniformLocation(my_program, my_color_texture); 

    glActiveTexture(GL_TEXTURE0 + i); 
    glBindTexture(GL_TEXTURE_2D, my_texture_object); 

    glUniform1i(my_sampler_uniform_location, i); 
+0

Может у меня есть пример кода? Я думал, что делаю это, но результат - это просто сплошная черная текстура. –

+0

Проверьте ссылку Nehe. Это объясняется кодом и образцом. – Ani

+0

@MathewVelasquez вы должны опубликовать свой собственный код, чтобы мы могли увидеть, что с ним что-то не так, вместо того, чтобы просить кого-то еще написать его. – Tim

-2

Хорошо, я понял это!

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

Теперь я чувствую себя таким глупым, но эй, вот что такое отладка.

+5

Этого не должно быть; форма должна продолжаться бесконечно, вам не нужно переписывать их в каждом кадре. Может быть, ваша инициализация по какой-то причине терпит неудачу, или вы случайно переписываете ее где-то в другом месте? – Tim