【问题标题】:OpenGL on Android - Texture Mapping - Only top left pixel visible on screenAndroid 上的 OpenGL - 纹理映射 - 屏幕上仅显示左上角像素
【发布时间】:2011-11-13 04:27:00
【问题描述】:

我正在尝试理解纹理映射的概念。我试图将纹理映射到正方形(由 2 个三角形组成)。然而,只有图像的左上角像素被完全渲染到正方形上。为什么会这样?我见过another post 有同样的问题.. 但该解决方案对我不起作用

初始设置

    gl.glDisable(GL10.GL_DITHER);               //Disable dithering ( NEW )
    gl.glEnable(GL10.GL_TEXTURE_2D);            //Enable Texture Mapping
    gl.glShadeModel(GL10.GL_SMOOTH);            //Enable Smooth Shading
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    //Black Background
    gl.glClearDepthf(1.0f);                     //Depth Buffer Setup
    gl.glEnable(GL10.GL_DEPTH_TEST);            //Enables Depth Testing
    gl.glDepthFunc(GL10.GL_LEQUAL);             //The Type Of Depth Testing To Do

顶点坐标 -

    private float[] _vertices = {0.0f, 0.0f,0.0f, 1.0f,
                            60.0f, 0.0f, 0.0f, 1.0f,
                            0.0f, 60.0f, 0.0f, 1.0f,
                            60.0f, 60.0f, 0.0f, 1.0f};

纹理坐标 -

    private float _texCoords[] = {0.0f, 1.0f,
    1.0f, 1.0f,
    0.0f, 0.0f,
    1.0f, 0.0f };

加载纹理方法-

public void loadGLTexture(GL10 gl, Context context) {
    //Get the texture from the Android resource directory
    InputStream is = context.getResources().openRawResource(com.mhoapps.bugswatter.R.drawable.crate);
    Bitmap bitmap = null;
    try {
        //BitmapFactory is an Android graphics utility for images
        bitmap = BitmapFactory.decodeStream(is);
    } finally {
        //Always clear and close
        try {
            is.close();
            is = null;
        } catch (IOException e) {
        }
    }

    // Generate one texture pointer...
    gl.glGenTextures(1, _textures, 0);
    int mTextureId = _textures[0];

    // ...and bind it to our array
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId);

    // Create Nearest Filtered Texture
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
            GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
            GL10.GL_LINEAR);


    // Use the Android GLUtils to specify a two-dimensional texture image
    // from our bitmap
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);       //Clean up


    bitmap.recycle();
}

最后是draw方法

    public void draw(GL10 gl) {
    //Bind the texture according to the set texture filter

    //gl.glLoadIdentity();
    gl.glTranslatef(0.0f, 0.0f, -3.0f);



    gl.glEnable(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, _textures[0]);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(4, GL10.GL_FLOAT, 0, _currentVertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, _bugTexBuffer1);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

【问题讨论】:

  • 向我们展示您的相关代码。没有它,我们只能猜测。当提到另一个帖子时,至少要链接到它。
  • 仅供参考:在 OpenGL 中,您不会进行“初始”设置。特别是你设置的那些状态实际上应该在绘图函数中设置。

标签: android opengl-es textures


【解决方案1】:

您是否指定了纹理坐标?听起来你不是,它们只是默认为 (0, 0)。另一个选项是纹理矩阵 - 您是否将其设置为全零?

【讨论】:

  • 我已经添加了上面的代码。我想我在这里设置 tex 坐标。然后将其转换为 floatbuffer。
  • 哎呀..你的观点是完全正确的。我没有使用 glEnableClientState(GL_TEXTURE_COORD_ARRAY),而是使用了 glEnable(GL_TEXTURE_COORD_ARRAY) 并且可悲地浪费了 3 个小时!
猜你喜欢
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
相关资源
最近更新 更多