可以使用glDrawTexfOES进行Android OpenGL ES缩放吗?

时间:2011-08-12 15:42:12

标签: android opengl-es

我使用glDrawTexfOES绘制了一些纹理,显示效果很好。我希望能够改变相机视图以给人一种放大或缩小的印象,但这就是我遇到麻烦的地方。我尝试制作基本的顶点数组,这个工作正常,我可以缩放。但是,我希望能够使用glDrawTexfOES缩放纹理。相关代码如下:

onSurfaceCreated包括对以下内容的调用:

gl.glEnable(GL10.GL_TEXTURE_2D);            
gl.glShadeModel(GL10.GL_SMOOTH);        
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    
gl.glClearDepthf(1.0f);                 
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

onSurfaceChanged完全实施(我怀疑问题在于此处)

public void onSurfaceChanged(GL10 gl, int width, int height) {
    mWidth = width;
    mHeight = height;
    gl.glViewport(0, 0, mWidth, mHeight);   
    gl.glMatrixMode(GL10.GL_PROJECTION);    
    gl.glLoadIdentity();    
    gl.glOrthof(0, mWidth, 0, mHeight, -1, 1);
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity();                
}

最后,onDrawFrame实现:

public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);    
    gl.glLoadIdentity();
    // Set crop area (UVarray are uv co-ords for a texture map, the texture renders fine.)
((GL11) gl).glTexParameterfv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES,UVarray,0);
// Draw texture
((GL11Ext) gl).glDrawTexfOES(32.0f,32.0f,0.0f,64.0f,64.0f); 
}

我尝试将glViewportglOrthof的参数更改为宽度* 2和高度* 2,但纹理仍然根本不缩放,它们保持完全相同。当我交换使用顶点数组时,这些调整工作。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

glDrawTextfOES()的宽度和高度参数位于像素中。模型视图和投影矩阵仅影响位置,而不影响缩放本身。因此,不应使用64像素作为宽度和高度参数,而应使用全局缩放宽度和高度的变量,如果需要,使用纹理裁剪选择纹理的一部分。

这可能是一个有用的阅读 - OES_draw_texture