Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系Android OpenGL ES篇
2011-12-01 09:02
393 查看
首先我们在屏幕中心显示一个矩形,效果如图:
接下来我们修改glViewport和glOrthof的参数,观察效果:
首先我们修改一下glViewport,将
改为
效果如图:
代码:
我们修改了glViewPort的参数,将视口从0,0,480,800(全屏)改为0,0,240,400(四分之一屏幕,即屏幕左下角的四分之一),所以出现了上边的这个效果
接下来我们修改一下glOrthof的参数,这个时候为了便于观察,我们将glViewport改回
效果如图:
代码:
// 代码没有经过优化,为的是容易理解 public class OpenGLTestActivity extends Activity { GLSurfaceView glView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); glView = new GLSurfaceView(this); glView.setRenderer(new SimpleRenderer()); setContentView(glView); } class SimpleRenderer implements Renderer { @Override public void onDrawFrame(GL10 gl) { ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6 * 2 * 4); byteBuffer.order(ByteOrder.nativeOrder()); FloatBuffer vertices = byteBuffer.asFloatBuffer(); // 定义两个三角形的六个顶点 vertices.put(new float[] { 120.0f, 200.0f, 360.0f, 200.0f, 360.0f, 600.0f, 120.0f, 200.0f, 360.0f, 600.0f, 120.0f, 600.0f }); vertices.flip(); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertices); gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); gl.glDrawArrays(GL10.GL_TRIANGLES, 3, 3); } @Override public void onSurfaceChanged(GL10 arg0, int arg1, int arg2) { } @Override public void onSurfaceCreated(GL10 gl, EGLConfig arg1) { gl.glClearColor(0,0,1,1); gl.glColor4f(1.0f, 0.0f, 0.0f, 0.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // 整个屏幕作为视口 gl.glViewport(0, 0, 480, 800); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrthof(0, 480, 0, 800, 1, -1); } } }
接下来我们修改glViewport和glOrthof的参数,观察效果:
首先我们修改一下glViewport,将
gl.glViewport(0, 0, 480, 800);
改为
gl.glViewport(0, 0, 240, 400);
效果如图:
代码:
public class OpenGLTestActivity extends Activity { GLSurfaceView glView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); glView = new GLSurfaceView(this); glView.setRenderer(new SimpleRenderer()); setContentView(glView); } class SimpleRenderer implements Renderer { @Override public void onDrawFrame(GL10 gl) { ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6 * 2 * 4); byteBuffer.order(ByteOrder.nativeOrder()); FloatBuffer vertices = byteBuffer.asFloatBuffer(); // 定义两个三角形的六个顶点 vertices.put(new float[] { 120.0f, 200.0f, 360.0f, 200.0f, 360.0f, 600.0f, 120.0f, 200.0f, 360.0f, 600.0f, 120.0f, 600.0f }); vertices.flip(); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertices); gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); gl.glDrawArrays(GL10.GL_TRIANGLES, 3, 3); } @Override public void onSurfaceChanged(GL10 arg0, int arg1, int arg2) { } @Override public void onSurfaceCreated(GL10 gl, EGLConfig arg1) { gl.glClearColor(0,0,1,1); gl.glColor4f(1.0f, 0.0f, 0.0f, 0.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // 整个屏幕作为视口 // gl.glViewport(0, 0, 480, 800); gl.glViewport(0, 0, 240, 400); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrthof(0, 480, 0, 800, 1, -1); } } }
我们修改了glViewPort的参数,将视口从0,0,480,800(全屏)改为0,0,240,400(四分之一屏幕,即屏幕左下角的四分之一),所以出现了上边的这个效果
接下来我们修改一下glOrthof的参数,这个时候为了便于观察,我们将glViewport改回
gl.glViewport(0, 0, 480, 800);
// 将gl.glOrthof(0, 480, 0, 800, 1, -1);改为下边的代码 gl.glOrthof(0, 240, 0, 400, 1, -1);
效果如图:
代码:
public class OpenGLTestActivity extends Activity
{
GLSurfaceView glView;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
glView = new GLSurfaceView(this);
glView.setRenderer(new SimpleRenderer());
setContentView(glView);
}
class SimpleRenderer implements Renderer
{
@Override
public void onDrawFrame(GL10 gl)
{
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6 * 2 * 4);
byteBuffer.order(ByteOrder.nativeOrder());
FloatBuffer vertices = byteBuffer.asFloatBuffer();
// 定义两个三角形的六个顶点
vertices.put(new float[] {
120.0f, 200.0f,
360.0f, 200.0f,
360.0f, 600.0f,
120.0f, 200.0f,
360.0f, 600.0f,
120.0f, 600.0f
});
vertices.flip();
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertices);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
gl.glDrawArrays(GL10.GL_TRIANGLES, 3, 3);
}
@Override
public void onSurfaceChanged(GL10 arg0, int arg1, int arg2)
{
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig arg1)
{
gl.glClearColor(0,0,1,1);
gl.glColor4f(1.0f, 0.0f, 0.0f, 0.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// 整个屏幕作为视口
gl.glViewport(0, 0, 480, 800);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
// 将gl.glOrthof(0, 480, 0, 800, 1, -1);改为下边的代码 gl.glOrthof(0, 240, 0, 400, 1, -1);
}
}
}
相关文章推荐
- Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系Android OpenGL ES篇
- Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系Android OpenGL ES篇(转帖)
- Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系OpenGL篇
- Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系OpenGL篇
- Android OpenGL ES零基础系列(二):OpenGL坐标系的深入理解
- 对Android opengl ES世界坐标系和纹理坐标系的理解
- Android OpenGL ES和OpenGL一起学(一)------绘制一个简单的矩形
- Android OpenGL ES和OpenGL一起学(一)------绘制一个简单的矩形
- Android OpenGL ES和OpenGL一起学(三)——练习:一个不会改变形状的正方形
- Android OpenGL ES和OpenGL一起学(三)——练习:一个不会改变形状的正方形
- OpenGL中各种坐标系的理解
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——1.1 OpenGL ES 2.0基础知识
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——5.7 使用OpenGL ES接口保存屏幕截图
- Android OpenGL 开发3 - 坐标系以及矩阵变换(转)
- 移动端布局:视口viewport的理解
- android之OpenGL、OpenGL ES初步
- Android屏幕坐标与OpenGL ES视口坐标的转换
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——3.2 使用OpenGL ES 2.0绘制一个球
- Android OpenGL ES(六)创建实例应用OpenGLDemos程序框架 .
- OpenGL中glMatrixMode()函数以及视图变换,模型变换,投影变换,视口变换的理解