OpenGL ES 2.0纹理

时间:2010-12-03 16:38:13

标签: iphone opengl-es glsl

我正在尝试在iPhone上渲染OpenGL ES 2.0中的简单纹理四边形。几何图形很好,如果我在着色器中使用纯色,我会得到预期的四边形:

    gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0);

如果我直接渲染纹理坐标,我会得到预期的渐变:

    gl_FragColor = vec4 (texCoord.x, texCoord.y, 0.0, 1.0);

图像数据从UIImage加载,缩放到1024x1024以内,并加载到如下纹理中:

    glGenTextures (1, &_texture);
    glBindTexture (GL_TEXTURE_2D, _texture);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, 
        GL_UNSIGNED_BYTE, data);

widthheight以及data的内容都是正确的,正如调试器中所检查的那样。

当我更改片段着色器以使用纹理时:

    gl_FragColor = texture2D (tex, texCoord);

...并绑定纹理并像这样渲染:

    glActiveTexture (GL_TEXTURE0);
    glBindTexture (GL_TEXTURE_2D, _texture);

    // this is unnecessary, as it defaults to 0, but for completeness...
    GLuint texLoc = glGetUniformLocation(_program, "tex");          
    glUniform1i(texLoc, 0);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

......我一无所获。黑色四边形。 glGetError()不会返回错误,glIsTexture(_texture)会返回true。

我在这里做错了什么?我在网上找到的每一个例子都是一遍又一遍,但是每个人都像我一样完成它,并且调试器显示我对各种GL功能的参数是我期望它们的。

5 个答案:

答案 0 :(得分:1)

在glTexImage2D之后,使用glTexParameter设置MIN / MAG过滤器,默认值使用mipmap,因此该代码的纹理不完整。

答案 1 :(得分:1)

我遇到了同样的问题(黑色四边形),直到来自this question的jfcalvo的回复引导我到原因时才找到答案。基本上要确保你没有在不同的线程中加载纹理。

答案 2 :(得分:1)

确保在S和T方向上将纹理包装参数设置为GL_CLAMP_TO_EDGE。如果没有这个,纹理就不完整了,会显得很黑。

答案 3 :(得分:0)

确保使用正确的格式(常量)

调用(glTexImage2D)

确保您在glTexImage2D

之后释放图像资源

这就是我在android上的表现:

    int[] textures = new int[1];
            GLES20.glGenTextures(1, textures, 0);

            mTextureID = textures[0];
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID);

            GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
                    GLES20.GL_NEAREST);
            GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
                    GLES20.GL_TEXTURE_MAG_FILTER,
                    GLES20.GL_LINEAR);

            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
                    GLES20.GL_REPEAT);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
                    GLES20.GL_REPEAT);

            InputStream is = mContext.getResources()
                .openRawResource(R.drawable.ywemmo2);
            Bitmap bitmap;
            try {
                bitmap = BitmapFactory.decodeStream(is);
            } finally {
                try {
                    is.close();
                } catch(IOException e) {
                    // Ignore.
                }
 GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
        bitmap.recycle();

答案 4 :(得分:0)

也许你忘了

glEnable(GL_TEXTURE_2D);

就是这种情况,着色器中的texture2D会返回黑色,因为OP似乎受到影响。