1

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

    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());
    }
4

1 回答 1

2

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

  1. 背面剔除可以提高性能,因为通常从背面看不到面
  2. 每个面应该有不同的法线,正面的法线指向+z(例如),背面的法线指向-z。

另外我想告诉你,你在示例代码中设置的法线不正确。法线垂直于面部。本教程应该向您展示法线和向量的基础知识。

原帖

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

  1. 1-3为左下角的x,y,z值
  2. 4-6为左上角的x,y,z值
  3. 7-9是右上角的x,y,z值
  4. 10-12是右下角的x,y,z值
  5. 13-15 是矩形的 x,y,z 法线。

当你直接看着它时,这张脸期望你给出角落。如果您使用错误的顺序,则脸部“预计”您正在从另一侧看(如果您从 behing 看,右下角是左下角:P)。
启用后,您将看不到脸部,因为backFaceCulling它期望您在其后台,您永远不应该看到它(在另一侧应该有另一张脸,因为它有其他法线)。
我希望这对你来说很清楚。无论如何,要让 rect 从双方都可见,您必须禁用backFaceCulling. 我认为您必须禁用它,您应该将其添加IntAttribute.CullFaceMaterial.

于 2014-04-02T15:26:30.803 回答