到目前为止,我设法完成的工作是:


初始化GLSurfaceView / Renderer
在屏幕上画一个三角形
在屏幕上渲染正方形/矩形
在屏幕上添加位图纹理
确保渲染时尊重PNG透明性
自动缩放三角形,以便它们在所有屏幕尺寸下都能正确显示


但是,固定缩放的三角形后,背景矩形(带有纹理)不再占满屏幕。



我已经在这个问题上停留了一段时间,并且完全感到困惑,以至于我把毛巾丢了。

我不确定的主要部分是使用glFrustumf()和gluLookAt()。

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    gl.glViewport(0, 0, width, height);

    ratio = (float) width / height;
    gl.glMatrixMode(GL10.GL_PROJECTION);        // set matrix to projection mode
    gl.glLoadIdentity();                        // reset the matrix to its default state
    gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7);  // apply the projection matrix
}

@Override
public void onDrawFrame(GL10 gl) {
    // Clear the screen
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    // Set GL_MODELVIEW transformation mode
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity(); // reset the matrix to its default state

    // When using GL_MODELVIEW, you must set the camera view
    GLU.gluLookAt(gl, 0, 0, -5f, 0f, 0f, 0f, 0.0f, 1.0f, 0.0f);

    bg.draw(gl);
    // ...
}


如果有人有时间看一下问题,我已将文件上传到https://bitbucket.org/koonkii/test_opengl/src,因此您不必通过复制粘贴来重新创建代码。

最佳答案

GLU.gluLookAt(gl, 0, 0, -5f, 0f, 0f, 0f, 0.0f, 1.0f, 0.0f);


尝试将-5f更改为0,这是将摄像头向后移动5个单位,因此,除非您进行正交投影(我想不是,请尝试检查this),什么是OpenGL?这样做是根据透视图缩放背景多边形,您会看到它“较小”。

如果进行正交投影,则无论您在z轴上移动相机多少,都将始终看到相同的尺寸。这对于基于OpenGL的2D游戏很有用,因此请查看上面的链接。

编辑:gluPerspective和glOrtho

gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);


gluPerspective有一个名为“ fovy”的参数,它基本上是“ Y轴视场”。视场表示摄像机可以看到的空间量,基本上是“扩展”或“收缩”摄像机之前遇到的任何顶点。典型的人眼视角为45º。

zNear和zFar表示圆锥台的近和远极限,圆锥台是一个不可见的“盒子”,它确定哪些顶点在查看区域之外。

宽高比决定了相机的宽度和高度之间的比例。

在FOV始终为0的意义上,glOrtho是gluPerspective的特例。

gl.glOrthof(0.0f, (float) width, (float) height, 0.0f, 1.0f, -1.0f);


前四个参数指定剪切平面的大小(通常是屏幕的大小),后两个值指定远近和远处的视锥(除非您要通过将它们“远”放置来隐藏对象,否则不需要它) 。

我希望这可以为您解决一下。

10-07 19:21