Многоструктурные точечные спрайты в OpenGL ES2.0 на iOS? - PullRequest
4 голосов
/ 24 апреля 2011

Я пытаюсь создать многоструктурный точечный спрайт для приложения 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...

Однако, если я использую режим ТОЧКИ, я никогда не вижу вторую текстуру.То есть, ссылаясь на приведенный выше код шейдера, могу ли я сделать

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 ]

3 голосов
/ 13 мая 2011

В вашей основной программе есть опечатка.

Правильный параметр для передачи в glActiveTexture - GL_TEXTURE0, GL_TEXTURE1, ...

Обратите внимание, что GL_TEXTURE0, GL_TEXTURE1 не имеет значения0,1 и т. Д.

Поскольку вы передаете недопустимое значение в glActiveTexture, функция завершится сбоем, и поэтому активная текстура всегда будет по умолчанию (вероятно, 0), все ваши изменения переходят в текстуру в позиции 0.

1 голос
/ 29 марта 2012

Я думаю, может быть уже слишком поздно, чтобы публиковать это.

В вашем коде есть две проблемы.Одним из них является тот, который указал Сатьякам.Другая проблема заключается в том, что вы не должны использовать glUniform1f.Правый - это glUniform1i.Почтение f или i на хвосте означает float или integer.

1 голос
/ 26 апреля 2011

источник В моем случае есть смешивание для очков

Возможная проблема была в несуществующих параметрах

glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
...