簡體   English   中英

帶着色器的Hud(opengl-es 2.0)

[英]Hud with shaders (opengl-es 2.0)

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

我有一個在屏幕上繪制紋理四邊形的着色器,它使用MVP矩陣。 四邊形有自己的頂點,與視圖位置無關等等(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)。 據我所知,我需要創建一個ortho矩陣而不是“frustumM”,但我該怎么做呢? 頂點着色器應該如何使用四邊形的頂點?

好的,你有你的正交矩陣和四邊形,所以問題是什么,將四邊形的模型視圖矩陣轉換為所需位置(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傳遞給着色器:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM