铁汉着色器(OpenGL的ES 2.0) [英] Hud with shaders (opengl-es 2.0)

查看:169
本文介绍了铁汉着色器(OpenGL的ES 2.0)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何画上使用OpenGL ES 2.0的着色器HUD?

How to draw a HUD using shaders on opengl es 2.0?

我有画屏幕上的一个四纹理着色器,它使用MVP矩阵。四有它自己的顶点都是独立的视图位置等(MVP矩阵的原因)

I have a shader which draws a textured quad on screen, it uses MVP matrix. The quad has it own vertices which are independent of view position and so on (cause of MVP matrix)

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,但我以后应该怎么办?如何顶点着色器应采用四核的顶点?

I'd like to show the same quad on the top right corner (like a button or something else, HUD). As I understand, i need create an ortho matrix instead of "frustumM", but what should i do later? How vertex shader should use vertices of quad?

推荐答案

好吧,你有你的邻矩阵和四,有啥问题,你四的模型视图矩阵转换到所需的位置(X,Y,Z = 0)由邻矩阵相乘,倍增传递矩阵顶点着色器,你的矩阵乘法VERT位置,做:),我没有使用任何LOOKAT功能在我的code要做到这一点,但我有自己的code为矩阵计算的部分code一些的bada教程,对于投影矩阵我还有其他的功能。

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.

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

所以,这个code:

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

和传递posMatrix着色器:)

And pass posMatrix to shader :)

这篇关于铁汉着色器(OpenGL的ES 2.0)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆