我制作了一个游戏,其中我画了这样的贝塞尔曲线:
final VertexBufferObjectManager vbom = engine.getVertexBufferObjectManager();
final HighPerformanceMeshVertexBufferObject pMeshVBOM = new HighPerformanceMeshVertexBufferObject(vbom, pBufferData, pBufferData.length, DrawType.DYNAMIC, true, Mesh.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT);
final HighPerformanceLineChainVertexBufferObject pLeftCurbLineChainVBOM = new HighPerformanceLineChainVertexBufferObject(vbom, triangleCount * 3, DrawType.DYNAMIC, true, leftCurb.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT);
final HighPerformanceLineChainVertexBufferObject pRightCurbLineChainVBOM = new HighPerformanceLineChainVertexBufferObject(vbom, triangleCount * 3, DrawType.DYNAMIC, true, rightCurb.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT);
leftCurb = new LineStrip(0, 0, 10f, triangleCount, pLeftCurbLineChainVBOM){
@Override
protected void onManagedUpdate(final float pSecondsElapsed) {
super.onManagedUpdate(pSecondsElapsed);
drawByBezier(curveOffset);
};
void drawByBezier(float curveOffset){
for (int triangleIndex = 0; triangleIndex < triangleCount; triangleIndex++) {
this.setX(triangleIndex, getBezierX(triangleIndex, -curveBottom, -curveControlPoint, -curveTop + curveOffset));
this.setY(triangleIndex, triangleIndex * heightIncrement);
}
}
通过更改curveOffset的值,我改变了曲线的外观。
第一个参数(10f)是线宽。当我在Galaxy S5(android 5)上测试时,线宽被绘制为大约2个像素宽,如果我在那里放置较低的值,如1.5f,绘制的线非常薄。另一方面,像100f这样的大数字并没有做任何事情 - 线条保持相同(小)宽度。 我在Galaxy S3 mini(android 4.1.2)上测试了这个并且线宽在那里工作(性能是其他的东西虽然......)。线条按照我的意愿绘制。我怎么能在GalaxyS5(android 5)中做到这一点。对我来说,它看起来像设备或操作系统特定的问题(openGL版本?),但有什么办法可以克服这个问题吗?
答案 0 :(得分:1)
OpenGL ES实现不必支持绘制宽线。您可以使用以下方法查询可用线宽范围:
float[] range = new float[2];
GLES20.glGetFloatv(GLES20.GL_ALIASED_LINE_WIDTH_RANGE, range, 0);
// range[0] is the minimum supported line width.
// range[1] is the maximum supported line width.
这为您提供了您正在运行的特定设备所支持的范围。兼容的实现最大可以低至1.0。这意味着如果您希望代码在所有设备上运行,则不能使用宽行。
如果您想要具有宽线外观并且可以在任何设备上工作的东西,则必须绘制多边形。您可以将看起来像线条的东西绘制为面向观察者的薄四边形。