在libgdx中创建双面着色器

时间:2014-04-02 14:40:37

标签: opengl libgdx 3d-modelling

我在libgdx中绘制了一个带有纹理的plane,当你从另一边看它时它会消失。 有没有办法制作双面着色器?

    private Model createPlaneModel(final float width, final float height, final Material material,
                                   final float u1, final float v1, final float u2, final float v2) {

        modelBuilder.begin();
        MeshPartBuilder bPartBuilder = modelBuilder.part("rect",
                GL20.GL_TRIANGLES, VertexAttributes.Usage.Position |
                VertexAttributes.Usage.Normal |
                VertexAttributes.Usage.TextureCoordinates,
                material);
        //NOTE ON TEXTURE REGION, MAY FILL OTHER REGIONS, USE GET region.getU() and so on
        //bPartBuilder.setUVRange(u1, v1, u2, v2);
        bPartBuilder.rect(
                -(width*0.5f), -(height*0.5f), 0,
                (width*0.5f), -(height*0.5f), 0,
                (width*0.5f), (height*0.5f), 0,
                -(width*0.5f), (height*0.5f), 0,
                1, 1, 1);


        return (modelBuilder.end());
    }

1 个答案:

答案 0 :(得分:2)

编辑:我再次阅读了你的问题,你说你想从双方渲染同一张脸。这是通过禁用backFaceCulling完成的,就像我在帖子末尾写的那样。无论如何我不会这样做,因为:

  1. 背面剔除可以提升性能,因为从背面可以看到正常的面孔
  2. 每个面应该有不同的法线,正面的法线指向+ z(例如),背面的法线指向-z。
  3. 另外我想告诉您,您在示例代码中设置的法线不正确。法线垂直于脸部。 This tutorial应该向您展示法线和向量的基础知识。

    原帖

    请看this question 因为我是这两个问题的提问者(你链接的那个和我链接的那个)我知道你的问题 您使用的rect()方法需要15个参数:

    1. 1-3是左下角
    2. 的x,y,z值
    3. 4-6是左上角
    4. 的x,y,z值
    5. 7-9是右上角
    6. 的x,y,z值
    7. 10-12是右下角
    8. 的x,y,z值
    9. 13-15是rect的x,y,z法线。
    10. 面子希望,你直接看着角落。如果您使用了错误的订单,那么"期望"你是从另一边看的(右下角是左下角,如果从behing看P:。) 当backFaceCulling启用后,您将无法看到脸部,因为它预计您处于后方,这对您来说永远不可见(另一方面应该有另一张脸,因为它有其他法线到)。
      我希望这对你来说很清楚。无论如何要从两侧看到矩形,您必须禁用backFaceCulling。我认为你必须禁用它,你应该将IntAttribute.CullFace添加到Material