如何用opengl es绘制多个三角形,每个三角形具有不同的转换矩阵?

vybvopom  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(444)

由于我没有发现成功地绘制多个三角形,每个三角形都有不同的矩阵,所以现在我只能在cpu上变换顶点,并且使用没有矩阵变换的着色器。。
非常感谢您的帮助!
这是我当前的着色器:

attribute vec2 vertices;
    attribute vec2 textureUvs;
    varying vec2 textureUv;
    void main()
    {
      gl_Position = vec4(vertices,0.0,1.0);
      textureUv = textureUvs;
    };

它工作得很好,除了在调用opengl drawarray()之前所有的顶点都由cpu进行了转换之外,我想如果我能发送每个三角形矩阵并让opengl计算顶点,我的性能会更好。
以下是抽签通知:

public final static void drawTexture(FloatBuffer vertices, FloatBuffer textureUvs, int textureHandle, int count, boolean triangleFan)
{
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle);
    GLES20.glUseProgram(progTexture);
    GLES20.glEnableVertexAttribArray(progTextureVertices);
    GLES20.glVertexAttribPointer(progTextureVertices, 2, GLES20.GL_FLOAT, false,  2*Float.BYTES, vertices);
    GLES20.glEnableVertexAttribArray(progTextureUvs);
    GLES20.glVertexAttribPointer(progTextureUvs, 2, GLES20.GL_FLOAT, false, 2*Float.BYTES, textureUvs);

    if(triangleFan)
    {
        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4 * count); //Faster 10%
    }
    else
    {
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6 * count);
    }
    GLES20.glDisableVertexAttribArray(progTextureVertices);
    GLES20.glDisableVertexAttribArray(progTextureUvs);

}

请注意,这是一个精灵渲染器,这就是为什么我只使用二维顶点。

tmb3ates

tmb3ates1#

我们需要解决的实际问题是:“顶点着色器如何获得每个基本体(三角形或四边形)的信息?”
当您以opengl es 2.0为目标时,由于您在着色器中使用了“属性”(而不是“in”),并且您也在galaxy tab 2上进行了基准测试(galaxy tab 2最多只支持opengl es 2.0),以下是您的选项:
1:在主机(cpu)上变换单个精灵的顶点,并流式地将变换后的顶点上载到缓冲区对象并从中进行绘制(您当前所做的操作-坦率地说,这可能是您最好的选择,因为您的所有顶点的变换都可以在每一帧中动态更改)
2:使用示例(仅在opengl es 3.0之后可用,但您可以检查 EXT_instanced_arrays 以及 EXT_draw_instanced 在opengl es 2.0的扩展中,将每基元(四边形或三角形)信息写入一个单独的缓冲区对象,为其指定一个带有示例除数的通用顶点属性,并在着色器中使用顶点属性变量(可以使用 matN -在着色器中键入顶点属性,实际上需要调用 glVertexAttribPointer() 如果单个顶点属性大于4个分量(如矩阵),则使用不同偏移量乘以次数)
3:一个更“奇特”的解决方案还可以是分配一个纹理,并将每个基本体矩阵编码到其纹理的颜色组件中,并将纹理坐标分配给三角形的顶点,以便从顶点着色器内部的纹理中对矩阵进行采样(使用 texture2DLod ). 为了在纹理值中获得足够的精度(不仅仅是8位),您可能还需要检查 OES_texture_float 分机。
对于opengles2.0目标来说,缓冲区纹理甚至着色器存储缓冲区对象等更多选项都是不可能的,即使有扩展,因为gpu将缺乏必要的功能。

相关问题