关于视口和工作的问题平行投影

时间:2011-09-17 15:43:06

标签: android opengl-es

我创建了一个三角形(在android中),下面给出的是顶点大小,视口大小和范围的规范。平行投影尺寸。

vertices.put(new float[] {  0.0f, 0.0f,
                            319.0f, 0.0f,
                    160.0f, 479.0f }); 

gl10.glViewport(0, 0, 160, 480);
gl10.glOrthof(0, 160, 0, 480, 1, -1);

屏幕的实际分辨率为320 * 480,请参阅:

  • glsurfaceview.getWidth()= 320
  • glsurfaceview.getHeight()= 480

下面给出了我在模拟器中收到的输出的快照, ACTUAL RESULT

我不明白的是,我已经将视口设置为屏幕的一半,我希望只能查看三角形的一半(相信超出视口区域的任何东西都应该被剪裁)。以下是我期待的图片,

Expected result

我无法弄清楚这种行为的原因。有人可以帮我解决这个问题。

以下是我正在处理的实际代码,

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);

    rand = new Random(); //Random number generator

    glsurfaceview = new GLSurfaceView(this);

    glsurfaceview.setRenderer(this);

    setContentView(glsurfaceview);
}



@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglconfig) {
    Log.v("#MYAPP", "MyCanonActivity : Inside onSurfaceCreated");

    byteBuffer = ByteBuffer.allocateDirect(3 * 2 * 4);
    byteBuffer.order(ByteOrder.nativeOrder());
    vertices = byteBuffer.asFloatBuffer();
    vertices.put(new float[] {  0.0f, 0.0f,
                                319.0f, 0.0f,
                                160.0f, 479.0f });  

    vertices.flip();  


}

@Override
public void onDrawFrame(GL10 gl10) {

    gl10.glViewport(0, 0, 160, 480);
    gl10.glClearColor(0,0,0,1);
    gl10.glClear(GL10.GL_COLOR_BUFFER_BIT);

    gl10.glMatrixMode(GL10.GL_PROJECTION);
    gl10.glLoadIdentity();
    gl10.glOrthof(0, 160, 0, 480, 1, -1);
    gl10.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl10.glVertexPointer( 2, GL10.GL_FLOAT, 0, vertices);
    gl10.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}

 @Override
public void onSurfaceChanged(GL10 gl10, int width, int height) {
    Log.v("#MYAPP", "MyCanonActivity : Inside onSurfaceChanged");
}


@Override 
public void onResume() {
    super.onResume();
    glsurfaceview.onResume(); //Start rendering thread also
    Log.v("#MYAPP", "MyCanonActivity : onResume");


}

@Override
public void onPause() {
    super.onPause();
    glsurfaceview.onPause(); 
    Log.v("#MYAPP", "MyCanonActivity : onPause");
}

2 个答案:

答案 0 :(得分:0)

虽然我无法在计算机图形学方面找到“视口”的定义,但我可以提供这种解释。

视口确实会剪切查看区域。想象一下,如果你是一个船,从一个洞口望出去。您对船外的信息的看法受到港口孔大小的限制,或者换句话说,您对更大的外部世界的视图被端口孔“夹住”。计算机图形视图端口的工作方式相同,只是视口具有可延展性,即您可以轻松更改它。

因此,您在上面描述的剪辑正如您所期望的那样,它不会强制绘制三角形以适合视口内部。如果您想要在视口内完全绘制三角形,则必须将顶点的坐标转换为视口。

答案 1 :(得分:0)

实际上你的假设是正确的,你的图片应该看起来像第二个给出你的代码片段。可能是,在绘制完整尺寸的三角形后,您没有清除帧缓冲区(仍然具有整个大小),因此渲染实际上包含前一遍中的整个三角形以及在其上面渲染的一半。 / p>

顺便说一下,我希望你已经对正确的矩阵堆栈(投影)进行了glOrtho调用,并没有弄乱矩阵堆栈,尽管这可能会产生完全不同的结果。