2012-01-16 3 views
3

Я сохраню это: код, указанный в конце этого сообщения, находится в верхнем порядке в моем проекте. У меня есть OGLES2. . 0 рамки в месте, которое делает все, кроме текстур прекрасно при визуализации одной текстуры все, что я вижу, это черный ящик правильных размеровOpenGL ES 2.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); 
} 

ответ

6

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

Спасибо вам большое, вы совершенно правы! Я модифицировал, чтобы использовать .aaaa, и теперь я вижу свой текст :-) Очень, очень благодарен, действительно, пиво. – KomodoDave

+0

@ KomodoDave, пожалуйста, приветствуйте;) – rotoglup

Смежные вопросы