Почему мой фрагментный шейдер не может прочитать альфа-информацию, когда я переключаюсь на альфа-формат (A8) pixelFormat? - PullRequest
4 голосов
/ 04 марта 2011

Я создаю приложение для iOS, которое использует OpenGL ES 2.0.Я немного новичок в OpenGL, так что это может быть тривиальной ошибкой.

Я создал простой шейдер для маскировки одной текстуры другой, используя альфа-канал.Текстура маски инициализируется следующим образом:

glGenTextures (1, & name);glBindTexture (GL_TEXTURE_2D, name);

glTexParameterf (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 1024, 768, 0, GL_RGBA, GL_RU * 0);glBindFramebufferOES (GL_FRAMEBUFFER_OES, буфер);

glFramebufferTexture2DOES (GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D; * 0 * * *) * 1016B0 * 1016B0 * 1016BF * 1016BF * 1016BF * 1016BF * 1016FB * 1016B0B * * *(позже) нарисуйте некоторые вещи к текстуре маски и свяжите текстуру маски с этим фрагментным шейдером, чтобы применить ее к другой текстуре:

uniform sampler2D baseTextureSampler;
uniform sampler2D maskTextureSampler;
varying lowp vec4 colorVarying;
varying mediump vec2 textureCoordsVarying;  
varying mediump vec2 positionVarying; 

void main() {

      lowp vec4 texel = texture2D(baseTextureSampler, textureCoordsVarying);
      lowp vec4 maskTexel = texture2D(maskTextureSampler, positionVarying);

      gl_FragColor = texel*colorVarying*maskTexel.a; 
}

Это отрисовывает именно так, как я хочу,Однако, чтобы уменьшить накладные расходы при привязке буфера текстуры маски (что кажется существенным), я пытаюсь использовать 8-битный альфа-пиксельный формат только для текстуры маски.НО, если я изменю код из настройки RGBA:

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 1024, 768, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

... только в альфа-формате:

glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, 1024, 768, 0, GL_ALPHA, GL_UNSIGNED_BYTE, буфер);

... фрагментный шейдер не может ничего нарисовать.Поскольку я в первую очередь использую альфу из текстуры маски, похоже, она должна продолжать работать.Есть идеи, почему это не так?

1 Ответ

2 голосов
/ 04 марта 2011

Спецификация OpenGL ES 2.0 (или расширение GL_OES_framebuffer_object) не определяет форматы визуализации с только альфа-битами, поэтому они НЕ поддерживаются.Вам придется использовать формат RGBA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...