Android 视口工作问题&平行投影

Android 视口工作问题&平行投影,android,opengl-es,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); 屏幕的实际分辨率为32

我在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 下面是我在emulator中接收到的输出的快照,

我不明白的是,我已经将视口设置为只有屏幕的一半,并且我希望只查看一半的三角形。我相信任何超出视口区域的内容都应该被剪裁。下面是我期待的照片

我就是想不出这种行为的原因。有人能帮我吗

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

/** 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");
}

虽然我无法从计算机图形学的角度找到“视口”的定义,但我可以给出这样的解释

视口确实会剪裁查看区域。想象一下,如果你愿意的话,你在一艘船里,从它的一个舷窗向外看。你对船外事物的看法受到港口洞大小的限制,或者换句话说,你对更大的外部世界的看法被港口洞“截断”。计算机图形学中的视图端口的工作方式相同,只是视口是可延展的,即您可以轻松更改它


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

事实上,您的假设是正确的,并且您的图片应该与给定代码片段的第二张图片非常相似。可能是,在绘制全尺寸三角形后,您没有清除帧缓冲区,该帧缓冲区仍然具有全尺寸,因此您的渲染实际上包含上一个过程中的整个三角形以及在其上渲染的半个三角形


顺便说一句,我希望您已经完成了GLORTH,以便调用正确的矩阵堆栈投影,并且没有弄乱矩阵堆栈,尽管这可能会产生完全不同的结果。

为了澄清,您是否询问“视口”的作用?您好,据我所知,视口是我们在屏幕内指定的绘图区域。因此,我的问题是,当我将视口设置为屏幕大小的一半时,请参考我的原始问题以了解确切的规格,我希望在设置视口后所操作的任何东西都能在视口内绘制。因此,在本例中,我绘制的三角形超出了视口。我希望我能清楚地回答这个问题。作为opengl的初学者,我可能也很天真。B/w如果你能告诉我为什么会发生这种情况,那将是我正在寻找的答案。嗨,我不希望三角形适合视口。我希望三角形的一半被剪裁,以提供如第二张图所示的视图。所以我这里的问题是为什么剪辑没有发生。你是说在opengl中,这种剪辑不会像你所解释的那样发生在现实生活中吗。我还缺少什么吗?嗨,克里斯蒂安·劳,我只在投影矩阵中设置了格洛托。B/w我已将代码添加到原始问题中。我在代码中遗漏了什么吗?