到目前为止,我设法完成的工作是:
初始化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);
前四个参数指定剪切平面的大小(通常是屏幕的大小),后两个值指定远近和远处的视锥(除非您要通过将它们“远”放置来隐藏对象,否则不需要它) 。
我希望这可以为您解决一下。