Многоструктурные точечные спрайты в OpenGL ES2.0 на iOS?
Я пытаюсь сделать многоструктурный точечный спрайт для приложения iphone, использующего OpenGL ES 2.0. Я не могу найти никаких примеров этого в сети, и это, кажется, не работает. Есть ли какое-то встроенное ограничение, когда gl_PointCoord нельзя использовать на нескольких текстурах при использовании режима GL_POINTS для точечных спрайтов?
uniform sampler2D tex;
uniform sampler2D blur_tex;
vec4 texPixel = texture2D( tex, gl_PointCoord );
vec4 blurPixel = texture2D( blur_tex, gl_PointCoord );
Я уверен, что я правильно передаю текстуры, так как я могу отлично выполнять мультитекстурирование в режиме TRIANGLE_STRIP, но я надеюсь ускорить процесс, используя точечные спрайты.
Если это возможно, ссылка на пример рабочего кода будет очень полезна. Спасибо!
РЕДАКТИРОВАТЬ:
Вот как я передаю текстуры в мой шейдер. Это позволяет мне выполнять мультитекстурирование, когда я нахожусь в режиме TRIANGLE или TRIANGLE_STRIP.
//pass in position and tex_coord attributes...
//normal tex
glActiveTexture(0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex0);
glUniform1i(SAMPLER_0_UNIFORM, 0);
//blur tex
glActiveTexture(1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex1);
glUniform1i(SAMPLER_1_UNIFORM, 1);
//draw arrays...
Однако, если я использую режим POINTS, я никогда не вижу вторую текстуру. То есть, ссылаясь на приведенный выше код шейдера, делаю ли я
gl_FragColor = texPixel;
ИЛИ ЖЕ
gl_FragColor = blurPixel;
Я вижу ту же текстуру. Что кажется странным. Я предполагаю, что вы НЕ МОЖЕТЕ выполнять мультитекстурирование на точечном спрайте, и наличие двух активных текстур или двух вызовов gl_PointCoord вызывает проблемы. Но я надеюсь, что я не прав. Так что, если у кого-то есть простой пример мультитекстурирования, работающего с точечными спрайтами в OpenGL ES 2.0, я был бы рад взглянуть на этот код!
РЕДАКТИРОВАТЬ 2:
вершинный шейдер:
attribute vec4 position;
void main() {
gl_PointSize = 15.0;
gl_Position = position;
}
фрагментный шейдер:
precision mediump float;
uniform sampler2D tex;
uniform sampler2D blur_tex;
void main() {
vec4 texPixel = texture2D( tex, gl_PointCoord );
vec4 blurPixel = texture2D( blur_tex, gl_PointCoord );
//these both do the same thing even though I am passing in two different textures?!?!?!?
//gl_FragColor = texPixel;
gl_FragColor = blurPixel;
}
3 ответа
источник В моем случае есть смешивание для очков
Возможная проблема была в несуществующих параметрах
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
В вашей основной программе есть опечатка.
Правильный параметр для передачи в glActiveTexture - GL_TEXTURE0, GL_TEXTURE1, ...
Обратите внимание, что GL_TEXTURE0, GL_TEXTURE1 не имеет значения 0,1 и т. Д.
Так как вы передаете недопустимое значение в glActiveTexture, функция завершится сбоем, и поэтому активная текстура всегда будет по умолчанию (вероятно, 0), все ваши изменения будут в текстуре в 0 позиции.
Я думаю, что может быть слишком поздно, чтобы опубликовать это все же.
В вашем коде есть две проблемы. Одним из них является тот, который указал Сатьякам. Другая проблема заключается в том, что вы не должны использовать glUniform1f. Правый - это glUniform1i. Почтение f или i на хвосте означает float или integer.