如何在像素级的opengl Es 2.0中旋转纹理

时间:2014-02-22 16:32:41

标签: android opengl-es rotation opengl-es-2.0 pixel

我正在使用opengl像素级(2D)

在我遇到轮换之前一切都很好

我尝试了不同的方式而没有尝试

这是我在像素级别工作的矩阵

float[] uScreen =
      {
         2f/width, 0f, 0f, 0f,
         0f, -2f/height, 0f, 0f,
         0f, 0f, 0f, 0f,
        -1f, 1f, 0f, 1f
      };

顶点

String vertexSrc =
        "uniform mat4 uScreen;\n" +
        "attribute vec2 aPosition;\n" +
        "void main() {\n" +
        " gl_Position = uScreen * vec4(aPosition.xy, 0.0, 1.0);\n" +
        "}";

片段着色器

String fragmentSrc =

    "precision mediump float;\n"+
    "void main(void)\n" +
    "{\n" +
    " gl_FragColor = vec4(1, 0, 0, 1);\n" +
    "}";

这很好用,我可以毫无问题地在屏幕像素级上绘图。 但我想旋转纹理而不知道如何

现在尝试添加以下内容

long time = SystemClock.uptimeMillis() % 4000L;
float angleX = 0.090f * ((int) time);

float[] axis = { 1.0f,0.0f,0.0f};

Matrix.rotateM(uScreen,0,angleX,axis[0],axis[1],axis[2]);



GLES20.glUniformMatrix4fv(uScreenPos, 1, false, uScreen, 0);

旋转纹理,但是有一个奇怪的行为,一切都在屏幕上旋转0.0左右而不是在其中心

知道如何旋转它吗?

enter image description here

enter image description here

enter image description here

enter image description here

纹理(红色)在您的中心上方旋转超过0 0像素

1 个答案:

答案 0 :(得分:1)

我将MVP矩阵乘以旋转矩阵,所以我需要向后移动旋转矩阵并向前移动MVP矩阵

这是解决方案

Matrix.setIdentityM(rotationMat, 0);
Matrix.setRotateM(rotationMat, 0,angleX,1,0,0);
Matrix.translateM(uScreen, 0,sprite.x, sprite.y, 0);
Matrix.translateM(rotationMat, 0,-sprite.x, -sprite.y, 0);

立即工作:)