【问题标题】:setLineWidth works differently on different test machinessetLineWidth 在不同的测试机器上的工作方式不同
【发布时间】:2015-05-17 15:28:26
【问题描述】:

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

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

【问题讨论】:

    标签: opengl-es width line andengine bezier


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

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

    【讨论】:

    • 这就是我害怕的...谢谢
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多