OpenGL ES 2.0 纹理贴图

4

我正在尝试在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);

widthheightdata的内容在调试器中都是正确的。

当我将我的片段着色器更改为使用纹理时:

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函数参数符合我的预期。


就像你一样,我也无法看出代码中明显的错误。如果你愿意,能否在某个地方发布整个项目呢?肯定有一些非常有趣的事情发生了。 - Tommy
http://dl.dropbox.com/u/163839/FilteredImageView/FilteredImageView.mm - Xtapolapocetl
2
你的代码其他地方可能有问题 - 当匆忙地连接到测试项目时,你提供的东西完美地工作。在http://pastie.org/1345953的内容就是我写的全部,然后我抓取了目前在亚马逊首页上的Kindle图形,将其调整为1024x1024并保存为testImage.png,将其添加到项目中作为资源。运行程序导致http://img802.imageshack.us/img802/1174/screenshot20101203at232.png。 - Tommy
嗯,非常奇怪。不确定问题可能出在哪里,但我会去检查一下。谢谢你的帮助。 - Xtapolapocetl
你不知道是什么原因导致这个问题,对吧?就像我说的,除了纹理之外,所有东西都能正常工作,而且这只是包含在几个嵌套的UIScrollViews中。整个应用程序中再也没有OpenGL了。 - Xtapolapocetl
显示剩余4条评论
5个回答

2

我曾经遇到过同样的问题(黑色四边形),一直找不到答案,直到看到来自这个问题的jfcalvo的回复才找到了原因。基本上,请确保您没有在不同的线程中加载纹理。


2
在使用glTexImage2D之后,通过glTexParameter设置MIN/MAG过滤器,因为默认使用mipmaps,所以在该代码中纹理不完整。

我已经这样做了(我尝试过glTexImage2D之前和之后的两种方式)。没有成功。 - Xtapolapocetl

2

请确保在S和T方向上都将纹理包裹参数设置为GL_CLAMP_TO_EDGE。如果没有这样做,纹理将不完整并且会显示为黑色。


1
也许您忘记了启用GL_TEXTURE_2D。在这种情况下,着色器中的texture2D将返回黑色,就像OP似乎遇到的问题一样。

在OpenGL ES 2.0上,glEnable(GL_TEXTURE_2D)无效,只会生成GL_INVALID_ENUM。 - Krzysztof Kosiński

1

确保你调用(glTexImage2D)时使用了正确的格式(常量)

确保在glTexImage2D之后释放图像资源

这是我在安卓上的做法:

    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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接