【问题标题】:OpenGL ES 2.0 texturingOpenGL ES 2.0 纹理
【发布时间】:2011-05-19 20:43:25
【问题描述】:

我正在尝试在 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 函数显示我的参数是我期望的。

【问题讨论】:

标签: iphone opengl-es glsl


【解决方案1】:

也许你忘了

glEnable(GL_TEXTURE_2D);

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

【讨论】:

  • glEnable(GL_TEXTURE_2D) 在 OpenGL ES 2.0 上没有任何作用,它只是生成 GL_INVALID_ENUM。
【解决方案2】:

确保在 S 和 T 方向上都将纹理环绕参数设置为 GL_CLAMP_TO_EDGE。没有这个,纹理是不完整的,会出现黑色。

【讨论】:

    【解决方案3】:

    确保您以正确的格式(常量)调用(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】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 我已经这样做了(我在 glTexImage2D 之前和之后都尝试过)。没有运气。
        猜你喜欢
        • 2012-04-08
        • 1970-01-01
        • 2012-04-08
        • 2012-03-29
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        相关资源
        最近更新 更多