setLineWidth在不同的测试机器上的工作方式不同

时间:2015-05-17 15:28:26

标签: opengl-es width line andengine bezier

我制作了一个游戏,其中我画了这样的贝塞尔曲线:

    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版本?),但有什么办法可以克服这个问题吗?

1 个答案:

答案 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。这意味着如果您希望代码在所有设备上运行,则不能使用宽行。

如果您想要具有宽线外观并且可以在任何设备上工作的东西,则必须绘制多边形。您可以将看起来像线条的东西绘制为面向观察者的薄四边形。