OpenGL ES 2.0:纹理渲染黑色,几个小时没有分辨率:(

Kom*_*ave 3 shader textures pixel opengl-es-2.0

我会保持简单:本文末尾列出的代码在我的项目中按从上到下的顺序排列.我有一个OGLES2.0框架,它可以完美呈现除纹理之外的所有内容.渲染单个纹理时,我看到的是一个正确尺寸的黑盒子.

这是我已经验证的内容:

  • 输出纹理字节(它的格式GL_ALPHA)后,可以看到零和非零值,因此数据看起来是正确的(或者至少不是全黑!).

  • 纹理ID是正确的,通过在顶点着色器中使用以下内容进行验证: 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);
}
Run Code Online (Sandbox Code Playgroud)

rot*_*lup 6

你的代码看起来很好,我必须说我希望输出颜色是黑色的:因为你的纹理是GL_ALPHA格式,GL ES的文档说:

GL_ALPHA每个元素都是一个alpha分量.GL将其转换为浮点并通过将0附加为红色,绿色和蓝色将其组装成RGBA元素.

因此,如果要将Alpha值显示为灰度颜色,则需要指示片段着色器执行此操作:

gl_FragColor = texture2D(s_texture, v_texCoord).aaaa;
Run Code Online (Sandbox Code Playgroud)

这将复制所有红色,绿色,红色和alpha通道中的alpha值.

如果您希望输出Alpha通道保持1.0(不透明),那么您将需要:

gl_FragColor = vec4( texture2D(s_texture, v_texCoord).aaa, 1.0 );
Run Code Online (Sandbox Code Playgroud)