setLineWidth 在不同测试机上的作用不同
setLineWidth works differently on different test machines
我制作了一个游戏,我在其中绘制了这样的贝塞尔曲线:
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) 中做到这一点。对我来说,它看起来像是设备或 OS 特定问题(openGL 版本?),但有什么办法可以克服这个问题吗?
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 的最大值。这意味着如果您希望您的代码在所有设备上 运行,则不能使用宽线。
如果您想要具有宽线条外观并且适用于任何设备的东西,则必须绘制多边形。你可以画一些看起来像一条线的东西作为一个面向观察者的细四边形。
我制作了一个游戏,我在其中绘制了这样的贝塞尔曲线:
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) 中做到这一点。对我来说,它看起来像是设备或 OS 特定问题(openGL 版本?),但有什么办法可以克服这个问题吗?
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 的最大值。这意味着如果您希望您的代码在所有设备上 运行,则不能使用宽线。
如果您想要具有宽线条外观并且适用于任何设备的东西,则必须绘制多边形。你可以画一些看起来像一条线的东西作为一个面向观察者的细四边形。