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