了解OpenGLES android中的缓冲区

时间:2017-01-21 20:30:15

标签: android opengl-es

我有这个顶点着色器,我可以根据状态值来旋转或翻译obj。

private final String vertexShader="" +
        "attribute vec4 vertex;" +
        "attribute vec4 colors;" +
        "varying vec4 vcolors;" +
        "uniform int x;" +
        "uniform vec4 translate;"+
        "uniform mat4 rotate;"+
        "void main(){" +
            "vec4 app_verte=vertex;" +
            "if(x==1){" +
            "app_verte=vertex+translate;" +
            "}else if(x==2){" +
            "app_verte=rotate*app_verte;" +
            "}" +
            "vcolors=colors;" +
            "gl_Position=app_verte;" +
        "}";

对于旋转我使用a矩阵,使用矩阵关联是从float [16]数组构建的,如下所示:

|cos(angle),-sin(angle),0,0|
|sin(angle), cos(angle),0,0|
|0         ,           ,0,0|

现在我有不同的问题,因为我很难理解。如果我想改变转换类型,我必须设置x值。现在要进行连续变换,我认为顶点buffere将是相同的,并且在变换之后,缓冲区的值将被改变。现在没有任何事情发生,因为它变换和绘制与相同的协调。我首先只放置了coordinatesbuffer。有一种方法可以使用与VRAM相同的缓冲区,而不是每次都放置它,如果没有,在转换后如何将更改的缓冲区拉到我的缓冲区obj而不使用数组转换点并将其放入缓冲?? 对不起我的英语,并感谢所有人。

1 个答案:

答案 0 :(得分:0)

顶点缓冲区采用这种方式设计,因此您只需将它们发送到GPU一次即可减少流量。然后使用矩阵(或其他系统,如平移向量)在顶点着色器中应用变换,这样您最多只能发送4x4浮点缓冲区。

如果我了解您的问题是什么,那就是您同时使用多个系统。您有一个平移向量和一个矩阵,但您可以使用其中一个或另一个。因此,在您的情况下,您可以在着色器中简单地应用它们app_verte = rotate*app_verte + translate;app_verte = rotate*(app_verte + translate);已经这两个不一样,我猜你在某些时候需要像{ {1}}这是不可解决的,因为操作次数会随着时间的推移而增加。

所以你需要选择一个系统,在你的情况下应该是一个矩阵。而不是发送转换矩阵,您可以转换应用程序的CPU部分上的矩阵,并仅将其发送到着色器。您需要找到工具来乘以矩阵并生成平移和旋转矩阵。你可以自己制作但已经看过你发布的那个我很确定第二个最后一个值应该是app_verte = rotate2*(rotate1*app_verte + translate1) + translate2;而不是1(尽管它必须是一个拼写错误,因为最后一行包含3个值而其他包含4)。

所以有一个矩阵,在开始时设置为与0对应的标识。然后,对于x=0情境,将矩阵设置为翻译矩阵x=1。并且myMatrix = generateTranslationMatrix(x, y, z)对旋转矩阵x=2执行相同操作。现在,当你需要继续操作时,要简单地连接它们,你只需将它们相乘,所以对于你们两个你都会myMatrix = generateRotationMatrix(x, y, z, angle)。但是没有理由将这些值保持分离,所以最后你只想要一些方法来操纵方向的状态:

myMatrix = generateTranslationMatrix(x, y, z)*generateRotationMatrix(x, y, z, angle)

然后你可以根据需要在你的代码中添加其他方法,但是例如,如果你处理触摸事件,当手指向上或向下移动时你将向前或向后移动,而左右移动将旋转对象然后它看起来像这样:

Matrix myMatrix;

onLoad() {
    myMatrix = Matrix.identity();
}

onTurnRight(float angle) {
    myMatrix = myMatrix * generateRotationMatrix(0, 1, 0, angle);
}

onMove(float x, float y, float z) {
    myMatrix = myMatrix * generateTranslationMatrix(x, y, z);
}