如何在opengl es 2.0中的2D游戏中设置深度范围?

野蛮人

因此,我目前正在为Android进行2D游戏项目,并且正在使用Opengl ES 2.0。我的深度缓冲区默认范围是0.0到1.0,但我想将其扩展到0.0-100.0。我尝试使用GLES20.glDepthRangef,但它似乎对我不起作用。Z值超出范围的图像:0.0-1.0不会显示在屏幕上。我想念什么吗?我将不胜感激!

private final float[] mtrxProjection = new float[16];
private final float[] mtrxView = new float[16];
private final float[] mtrxProjectionAndView = new float[16];

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {

        //current width and height.
        swp = width;
        shp = height;

        // Redo the Viewport, making it fullscreen.
        GLES20.glViewport(0, 0, (int)swp, (int)shp);

        // Clear our matrices
        for(int i=0;i<16;i++)
        {
            mtrxProjection[i] = 0.0f;
            mtrxView[i] = 0.0f;
            mtrxProjectionAndView[i] = 0.0f;
        }

        // Setup our screen width and height for normal sprite translation.
        Matrix.orthoM(mtrxProjection, 0, 0f, swp, 0.0f, shp, 0, 100);

        // Depth testing
        GLES20.glEnable( GLES20.GL_DEPTH_TEST );
        GLES20.glDepthFunc( GLES20.GL_LEQUAL );
        GLES20.glDepthMask( true ); 
        GLES20.glDepthRangef(0,  100);

        // Set the camera position (View matrix)
        Matrix.setLookAtM(mtrxView, 0, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

        // Calculate the projection and view transformation
        Matrix.multiplyMM(mtrxProjectionAndView, 0, mtrxProjection, 0, mtrxView, 0);
}

这是我的顶点着色器:

public static final String vs_Image =
        "uniform mat4 u_MVPMatrix;" + // u_MVPMatrix is the mtrxProjectionAndView calculated above
        "attribute vec4 a_position;" +
        "attribute vec2 a_texCoord;" +
        "varying vec2 v_texCoord;" +
        "void main() {" +
        "  gl_Position = u_MVPMatrix * a_position;" +
        "  v_texCoord = a_texCoord;" +
        "}";
雷托·科拉迪(Reto Koradi)

参数glDepthRange()必须在0.0到1.0的范围内。它的工作方式是0.0到1.0代表深度缓冲区的整个可用范围。glDepthRange()可用于将深度值映射到整个可用范围的子范围,但不能扩展可用范围。

控制映射到深度缓冲区范围的坐标范围的方法是使用顶点着色器中应用的变换。生成的顶点着色器的输出坐标gl_Position位于剪辑坐标中,通过将位置的x,y和z除以w坐标可将其转换为归一化设备坐标(NDC),通常将其称为透视划分。NDC中然后映射到深度缓冲区范围的z值范围是[-1.0,1.0]。

在特定的顶点着色器中,可以gl_Position通过将输入位置乘以来获得u_MVPMatrix要解决您的问题,您需要确保正确设置此矩阵。使用glDepthRange()不是您要找的解决方案。

使用投影矩阵,您已经在z方向上设置了100个单位的范围,这看起来与您的目标一致:

Matrix.orthoM(mtrxProjection, 0, 0f, swp, 0.0f, shp, 0, 100);

问题似乎出在您的视图矩阵上:

Matrix.setLookAtM(mtrxView, 0, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

第3至第5个自变量是视点,在您的调用中为(0.0,0.0,1.0)。第6至第8个自变量是您要查看的点,在您的调用中为(0.0,0.0,0.0)。因此,您正在从z轴上的一个点看,从原点到原点的距离为一个单位。由于投影矩阵给出的总z范围为100个单位,因此视图体积中z值的范围为[-99.0,1.0]。

如果要将可见z范围改为[0.0,100.0],则需要将视图矩阵中的视点调整为距原点100个单位。调用将如下所示:

Matrix.setLookAtM(mtrxView, 0, 0f, 0f, 100f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

现在,您从点(0.0,0.0,100.0)朝原点看,投影矩阵给出了100个单位的范围。这为z坐标提供了[0.0,100.0]可见范围。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在OpenGL ES 2中正确缩放

来自分类Dev

如何在OpenGL ES 2中处理多个对象

来自分类Dev

如何在 2d 游戏中创建“冲刺”能力

来自分类Dev

Android OpenGL ES 2:如何在主活动中将OpenGL活动用作片段

来自分类Dev

Android OpenGL ES 2:如何在主活动中将OpenGL活动用作片段

来自分类Dev

OpenGL ES 2D矩阵设置

来自分类Dev

如何在openGL ES 2.0中执行2次传递以获得模糊效果

来自分类Dev

如何在OpenGL ES 2中使用顶点数组对象

来自分类Dev

Unity2D-如何在2D游戏中围绕圆形移动和旋转游戏对象?

来自分类Dev

如何在Android的OpenGL ES中渲染深度纹理

来自分类Dev

我应该如何在此2d Java游戏中实现跳跃/重力/下落

来自分类Dev

如何在2D游戏中提高物体的下落速度

来自分类Dev

如何在2D游戏中为子弹使用hardbody.addforce

来自分类Dev

如何在2D平台游戏中对碰撞检测做出反应

来自分类Dev

如何在 2D WPF 游戏中最智能地刷新 UI?

来自分类Dev

如何在OpenGL中移动2D相机

来自分类Dev

如何在OpenGL中移动2D相机

来自分类Dev

如何在OpenGL中使2D照明更好

来自分类Dev

如何在JavaFX中渲染场景?(2D游戏)

来自分类Dev

如何在Godot中像素化2D游戏?

来自分类Dev

在opengl es 2中如何释放纹理(ios硬崩溃)

来自分类Dev

如何在cocos2d-x(C ++)iOS游戏中检测CCArray中的Sprite的碰撞

来自分类Dev

如何使用unity3d在2D游戏中绘制单色背景?

来自分类Dev

如何在OpenGL ES 2.0中管理多个纹理?

来自分类Dev

如何在Common Lisp中编写opengl ES 2.0 / 3.0?

来自分类Dev

如何在iOS OpenGL ES 2.0中画星

来自分类Dev

如何在 Android 的 OpenGL ES 2.0 中检查上传的纹理?

来自分类Dev

Android上的OpenGL ES 2:如何使用VBO

来自分类Dev

Android上的OpenGL ES 2:如何使用VBO

Related 相关文章

  1. 1

    如何在OpenGL ES 2中正确缩放

  2. 2

    如何在OpenGL ES 2中处理多个对象

  3. 3

    如何在 2d 游戏中创建“冲刺”能力

  4. 4

    Android OpenGL ES 2:如何在主活动中将OpenGL活动用作片段

  5. 5

    Android OpenGL ES 2:如何在主活动中将OpenGL活动用作片段

  6. 6

    OpenGL ES 2D矩阵设置

  7. 7

    如何在openGL ES 2.0中执行2次传递以获得模糊效果

  8. 8

    如何在OpenGL ES 2中使用顶点数组对象

  9. 9

    Unity2D-如何在2D游戏中围绕圆形移动和旋转游戏对象?

  10. 10

    如何在Android的OpenGL ES中渲染深度纹理

  11. 11

    我应该如何在此2d Java游戏中实现跳跃/重力/下落

  12. 12

    如何在2D游戏中提高物体的下落速度

  13. 13

    如何在2D游戏中为子弹使用hardbody.addforce

  14. 14

    如何在2D平台游戏中对碰撞检测做出反应

  15. 15

    如何在 2D WPF 游戏中最智能地刷新 UI?

  16. 16

    如何在OpenGL中移动2D相机

  17. 17

    如何在OpenGL中移动2D相机

  18. 18

    如何在OpenGL中使2D照明更好

  19. 19

    如何在JavaFX中渲染场景?(2D游戏)

  20. 20

    如何在Godot中像素化2D游戏?

  21. 21

    在opengl es 2中如何释放纹理(ios硬崩溃)

  22. 22

    如何在cocos2d-x(C ++)iOS游戏中检测CCArray中的Sprite的碰撞

  23. 23

    如何使用unity3d在2D游戏中绘制单色背景?

  24. 24

    如何在OpenGL ES 2.0中管理多个纹理?

  25. 25

    如何在Common Lisp中编写opengl ES 2.0 / 3.0?

  26. 26

    如何在iOS OpenGL ES 2.0中画星

  27. 27

    如何在 Android 的 OpenGL ES 2.0 中检查上传的纹理?

  28. 28

    Android上的OpenGL ES 2:如何使用VBO

  29. 29

    Android上的OpenGL ES 2:如何使用VBO

热门标签

归档