由于我没有发现成功地绘制多个三角形,每个三角形都有不同的矩阵,所以现在我只能在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);
}
请注意,这是一个精灵渲染器,这就是为什么我只使用二维顶点。
1条答案
按热度按时间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将缺乏必要的功能。