OpenGL ES 2.0:纹理呈现黑色,几小时没有分辨率:(
我会保持简单:在这篇文章末尾列出的代码在我的项目中是按照从上至下的顺序排列的。 我有一个OGLES2.0框架,它可以完美呈现除纹理之外的所有内容。 渲染单个纹理时,我看到的是正确尺寸的黑盒子。
以下是我已验证的内容:
输出纹理字节(格式为GL_ALPHA
)很明显看到有零和非零值,所以数据看起来正确(或者至少不是全部黑色!)。
纹理ID是正确的,通过在顶点着色器中使用以下内容进行验证: gl_FragColor=vec4(v_texCoord.xy,0.0,1.0);
观察从(0,0)->(0,1)->(1,1)->(1,0)
移动的black->green->yellow->red
的期望流动。
我的纹理具有两个维度的权力: 256 x 64
,正确地反映在数据数组中。
我会非常感谢帮助确定什么是错误的,因为经过几个小时的Google搜索和推动,我很难过!
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);
}
你的代码看起来很好,我必须说我希望输出颜色是黑色的:因为你的纹理是GL_ALPHA格式,GL ES的文档说:
GL_ALPHA每个元素都是单个alpha组件。 GL将它转换为浮点,并通过为红色,绿色和蓝色附加0来将它组装到一个RGBA元素中。
所以如果你想显示你的alpha值为灰度色,你需要指示你的片段着色器来做到这一点:
gl_FragColor = texture2D(s_texture, v_texCoord).aaaa;
这将复制所有红色,绿色,红色和alpha通道中的alpha值。
如果你希望你的输出alpha通道保持1.0(不透明),那么你需要:
gl_FragColor = vec4( texture2D(s_texture, v_texCoord).aaa, 1.0 );
链接地址: http://www.djcxy.com/p/33597.html
上一篇: OpenGL ES 2.0: Texture renders black, several hours without resolution :(