Android 查找矩阵是否相交以进行剔除测试?

Android 查找矩阵是否相交以进行剔除测试?,android,opengl-es,opengl-es-2.0,Android,Opengl Es,Opengl Es 2.0,我正在开发一个2d游戏,在这个游戏中,我无法使用旋转传感器旋转视图,也无法在屏幕上查看不同的纹理 我使用此方法散射所有纹理: public void position(ShaderProgram program, float[] rotationMatrix , float[] projectionMatrix , float longitude , float latitude , float radius) { this.radius = radius; viewMat =

我正在开发一个2d游戏,在这个游戏中,我无法使用旋转传感器旋转视图,也无法在屏幕上查看不同的纹理

我使用此方法散射所有纹理:

public void position(ShaderProgram program, float[] rotationMatrix , float[] projectionMatrix , float longitude , float latitude , float radius)
{
    this.radius = radius;
    viewMat = new float[MATRIX_SIZE];
    mvpMatrix = new float[MATRIX_SIZE];

    // correct coordinate system to fit landscape orientation
    SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, viewMat);

    //correct the axis so that the direction of Y axis is to the sky and Z is to the front
    Matrix.rotateM(viewMat, 0, -90f, 1f, 0f, 0f);

    // first rotation - longitude
    Matrix.rotateM(viewMat, 0, longitude, 0f, 1f, 0f);

    //second rotation - latitude
    Matrix.rotateM(viewMat, 0, latitude, 1f, 0f, 0f);

    // used to control the distance of viewing the texture (currently only z translation is used)
    Matrix.translateM(viewMat, 0 , 0f , 0f , radius);

    //multiply the adjusted view matrix with projection matrix
    Matrix.multiplyMM(mvpMatrix, 0, projectionMatrix, 0, viewMat, 0);

    //send mvp matrix to shader
    GLES20.glUniformMatrix4fv(program.getMatrixLocation(), 1, false, mvpMatrix, 0);
}
但是,当我渲染大量纹理时,帧速率会变得非常缓慢。所以我考虑使用剔除法

在每个纹理都有不同的视图矩阵之后,我应该如何执行剔除测试


我的意思是,如果表示我现在正在查看的位置的矩阵与表示每个纹理的矩阵相交,那么我将如何比较?因此我将决定是否绘制它?

有很多方法可以做到这一点,但每个方法都需要比仅一个矩阵更多的方法。仅矩阵(假设对象的中心位于0,0,而不应用任何矩阵)无法处理仅看到对象一部分的情况

可以使用8个点(例如立方体)定义原始对象的边界。想象一下,如果使用与对象相同的矩阵绘制这8个点,这些点将出现在对象周围,以便它们可以定义一个曲面,该曲面将框住对象本身

因此,这些点可以与生成的矩阵(整个MVP矩阵)相乘,从而将它们投影到坐标系的openGL可绘制部分。现在,您只需检查,如果这些点中的任何一个在每个轴的[-1,1]内,则必须绘制对象。所以x,y和z必须在-1和1之间

更新:


实际上,这还不够,因为即使所有8个点都在这些坐标之外,也可能发生交点。您需要一个合适的算法来找到两个形状的交点…

您的对象必须有一个统一的视图矩阵,以便在整个场景中深度保持一致。然后,您可以启用深度测试,GPU将决定丢弃什么。不过我不确定是否需要剔除。即使只是2d纹理,我也需要立方体吗?我可以用长方形吗?如果是这样,我是在着色器上还是在java代码上进行交集测试?可以使用4个点的矩形。在着色器中,这些已为您完成。不会为超出范围的项目创建片段,因此您无需执行任何操作。此外,如果使用正交投影,您可以将x和y与[-1,1]中的矩形进行比较,这要容易得多。是的,你在CPU上这样做,GPU的工作量就更少了。如果已经为我做了,为什么我“绘制”(超出边界)的纹理越多,渲染速度就越慢?顶点部分仍然完成。它仍将尝试计算需要绘制多边形的哪一部分,以便执行整个管道。但是超出边界的像素将被丢弃,并且不会为它们调用片段着色器。但是,您无法在顶点着色器中控制放弃多边形的某些部分,因此只有在片段着色器中放弃像素才有意义,但正如我所说的,它无论如何都不会到达片段着色器。