OpenGL ES 2.0: текстура рендерится черным, несколько часов без разрешения :( - PullRequest
3 голосов
/ 17 января 2012

Я буду прост: код, указанный в конце этого поста, находится в порядке сверху вниз в моем проекте.У меня есть OGLES2.0 фреймворк, который отлично отображает все, кроме текстур.При рендеринге одной текстуры все, что я вижу, это черный ящик правильных размеров.

Вот что я проверил:

  • Вывод байтов текстуры (это форматGL_ALPHA) ясно видеть, что есть нулевые и ненулевые значения, поэтому данные выглядят корректно (или, по крайней мере, не все черные!).

  • Идентификаторы текстуры верны,проверяется с помощью следующего в вершинном шейдере: gl_FragColor=vec4(v_texCoord.xy,0.0,1.0); ..и наблюдается ожидаемый black->green->yellow->red цветовой поток, движущийся от (0,0)->(0,1)->(1,1)->(1,0).

  • Моя текстура имеет силу двухразмеры: 256 x 64, правильно отраженные в массиве данных.

Я был бы чрезвычайно признателен за помощь в определении того, что не так, так как после нескольких часов поиска и поиска я в тупике!

glGenTextures(1, &_textureId);
GLint savedId;
glGetIntegerv(GL_TEXTURE_BINDING_2D, &savedId);
glBindTexture(GL_TEXTURE_2D, _textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
GLenum datatype = -1;
GLenum format = -1;
switch([self pixelFormat]) {
    case kGLTexturePixelFormat_RGBA8888:
        format=GL_RGBA;
        datatype=GL_UNSIGNED_BYTE;
        break;
    case kGLTexturePixelFormat_RGB565:
        format=GL_RGB;
        datatype=GL_UNSIGNED_SHORT_5_6_5;
        break;
    case kGLTexturePixelFormat_A8: // * This is current format, used for testing.
        format=GL_ALPHA;
        datatype=GL_UNSIGNED_BYTE;
        break;
    default:
        [NSException raise:NSInternalInconsistencyException format:@""];

}
glTexImage2D(GL_TEXTURE_2D, 0, format, [self pixelsWide], [self pixelsHigh], 0, format, datatype, [self data]);
glBindTexture(GL_TEXTURE_2D, savedId);
//...
GLint s_textureId = glGetUniformLocation(program, "s_texture");
//...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, [_textureAtlas textureId]);
glUniform1i(s_textureId, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

// In vertex shader:
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
uniform sampler2D s_texture;
void main() {
    // ...
    v_texCoord = a_texCoord;
}

// In fragment shader:
varying vec2 v_texCoord;
uniform sampler2D s_texture;
void main() {
    // ...
    gl_FragColor = texture2D(s_texture, v_texCoord);
}

1 Ответ

6 голосов
/ 17 января 2012

Ваш код выглядит нормально, и я должен сказать, что я ожидаю, что выходной цвет будет черным: поскольку ваша текстура имеет формат GL_ALPHA, документация GL ES гласит:

GL_ALPHA Каждый элемент представляет собой один альфа-компонент. GL преобразует это с плавающей точкой и собирает его в элемент RGBA, прикрепив 0 для красного, зеленого и синего.

Так что, если вы хотите отобразить свое альфа-значение в виде оттенков серого, вам нужно будет сделать так, чтобы ваш фрагментный шейдер сделал это так:

gl_FragColor = texture2D(s_texture, v_texCoord).aaaa;

Это продублирует альфа-значение во всех красных, зеленых, красных и альфа-каналах.

Если вы хотите, чтобы ваш выходной альфа-канал оставался 1,0 (непрозрачным), то вам понадобится:

gl_FragColor = vec4( texture2D(s_texture, v_texCoord).aaa, 1.0 );
...