简体   繁体   English

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

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

How to draw a HUD using shaders on opengl es 2.0? 如何在opengl es 2.0上使用着色器绘制HUD?

I have a shader which draws a textured quad on screen, it uses MVP matrix. 我有一个在屏幕上绘制纹理四边形的着色器,它使用MVP矩阵。 The quad has it own vertices which are independent of view position and so on (cause of MVP matrix) 四边形有自己的顶点,与视图位置无关等等(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);

I'd like to show the same quad on the top right corner (like a button or something else, HUD). 我想在右上角显示相同的四边形(如按钮或其他东西,HUD)。 As I understand, i need create an ortho matrix instead of "frustumM", but what should i do later? 据我所知,我需要创建一个ortho矩阵而不是“frustumM”,但我该怎么做呢? How vertex shader should use vertices of quad? 顶点着色器应该如何使用四边形的顶点?

Ok, You have your ortho matrix and quad, so whats the problem, translate modelview matrix of your quad to desired position (x,y,z=0), multiply it by ortho matrix , pass multiplied matrix to vertex shader, multiply vert position by your matrix and done :), i am not using any lookat function in my code to do this, but i have own code for matrices computation its partially code from some bada tutorial, for projection matrix i have other function. 好的,你有你的正交矩阵和四边形,所以问题是什么,将四边形的模型视图矩阵转换为所需位置(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);
    }

So, with this code : 所以,使用此代码:

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);

And pass posMatrix to shader :) 并将posMatrix传递给着色器:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM