android - 带有着色器的 HUD (opengl-es 2.0)

标签 android opengl-es opengl-es-2.0

如何在 opengl es 2.0 上使用着色器绘制 HUD?

我有一个在屏幕上绘制带纹理的四边形的着色器,它使用 MVP 矩阵。四边形有自己的顶点,这些顶点与 View 位置等无关(MVP 矩阵的原因)

Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3f, 17);
Matrix.setLookAtM(mVMatrix, 0, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

我想在右上角显示相同的四边形(如按钮或其他东西,HUD)。 据我了解,我需要创建一个正交矩阵而不是“frustumM”,但我以后应该做什么?顶点着色器应该如何使用四边形的顶点?

最佳答案

好的,你有正交矩阵和四边形,那有什么问题,将四边形的模型 View 矩阵转换到所需位置 (x,y,z=0),将其乘以正交矩阵,将相乘后的矩阵传递给顶点着色器,将顶点位置乘以你的矩阵并完成 :),我没有在我的代码中使用任何 lookat 函数来执行此操作,但我有自己的矩阵计算代码,它的部分代码来自一些 bada 教程,对于投影矩阵我有其他功能。

  void
    Letter::Ortho(Matrix* result, float fovy, float aspect, float nearZ, float farZ)
    {
        GLfloat frustumW, frustumH;

        frustumH = tanf(fovy / 360.0f * PI) * nearZ;
        frustumW = frustumH * aspect;

        Frustum(result, -frustumW, frustumW, -frustumH, frustumH, nearZ, farZ);
    }

    void
    Letter::LoadIdentity(Matrix* result)
    {
        memset(result, 0x0, sizeof(Matrix));
        result->m[0][0] = 1.0f;
        result->m[1][1] = 1.0f;
        result->m[2][2] = 1.0f;
        result->m[3][3] = 1.0f;
    }


    void
    Letter::Frustum(Matrix *result, float left, float right, float bottom, float top, float nearZ, float farZ)
    {
        float   deltaX = right - left;
        float   deltaY = top - bottom;
        float   deltaZ = farZ - nearZ;
        Matrix  frustum;

        if ((nearZ <= 0.0f) || (farZ <= 0.0f) ||
            (deltaX <= 0.0f) || (deltaY <= 0.0f) || (deltaZ <= 0.0f))
        {
             return;
        }

        frustum.m[0][0] = 2.0f * nearZ / deltaX;
        frustum.m[0][1] = frustum.m[0][2] = frustum.m[0][3] = 0.0f;

        frustum.m[1][1] = 2.0f * nearZ / deltaY;
        frustum.m[1][0] = frustum.m[1][2] = frustum.m[1][3] = 0.0f;

        frustum.m[2][0] = (right + left) / deltaX;
        frustum.m[2][1] = (top + bottom) / deltaY;
        frustum.m[2][2] = -(nearZ + farZ) / deltaZ;
        frustum.m[2][3] = -1.0f;

        frustum.m[3][2] = -2.0f * nearZ * farZ / deltaZ;
        frustum.m[3][0] = frustum.m[3][1] = frustum.m[3][3] = 0.0f;

        Multiply(result, &frustum, result);
    }

因此,使用此代码:

LoadIdentity(&matPerspective);
Ortho(&matPerspective, 60.0f, TEXMANAGER.aspect, -1.0f, 20.0f);
LoadIdentity(&matModelview);
Translate(&matModelview, x ,y ,z);
Scale(&matModelview,size);
//Rotate(&matModelview, 0.0f, 1.0f, 0.0f, 1.0f);
Multiply(&posMatrix, &matModelview, &matPerspective);

并将 posMatrix 传递给着色器 :)

关于android - 带有着色器的 HUD (opengl-es 2.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5764213/

相关文章:

opengl-es - 使用 OpenGL 着色器绘制多边形的边缘

android - Nexus 5 5.1 上的 OpenGL 问题

Android OpenGL 错误(未在我的应用中使用 OpenGL)

android - 在 Android 上使用 GLSL ES (OpenGL ES 2.0) 渲染茶壶

android - 如果数组为空,如何找到最大的数字和 null

java - 使用RSA私钥解密

android - 在没有FileStreams的情况下以WAL模式备份sqlite db//通过导出/备份sql命令

android - 实现baresip NDK库导致缺少*.so文件

android - OpenGL ES 1.x vs. 2.x : OpenGL ES 1. x 还值得学习吗?

Android OpenGL ES 2.0 多重纹理和相机