GL_DEPTH_TEST不起作用

时间:2015-04-12 21:34:57

标签: java android 3d geometry opengl-es-2.0

所以,这是我的3D立方体代码:

Mesh cube = new Mesh(false, 8, 36,
        new VertexAttribute(VertexAttribute.POSITION, 3, ShaderProgram.POSITION_ATTRIBUTE),
        new VertexAttribute(VertexAttribute.COLOR_PACKED, 4, ShaderProgram.COLOR_ATTRIBUTE)
    );

float x = -100;
float y = -50;
float z = 250;

float w = 50;
float h = 50;
float l = 50;

float r = Color.RED.toFloatBits();
float g = Color.GREEN.toFloatBits();
float b = Color.BLUE.toFloatBits();

float[] vertices = {
    -w / 2f + x, y, l / 2f + z,  // 0
    r,
    -w / 2f + x, h + y, l / 2f + z, // 1
    r,
    w / 2f + x, h + y, l / 2f + z, // 2
    b,
    w / 2f + x, y, l / 2f + z, // 3
    b,

    w / 2f + x, y, -l / 2f + z, // 4
    g,
    w / 2f + x, y + h, -l / 2f + z, // 5
    g,
    -w / 2f + x, y + h, -l / 2f + z, // 6
    r,
    -w / 2f + x, y, -l / 2f + z, // 7
    r
};

short[] indices = {
    0, 1, 2, 2, 3, 0,
    3, 2, 5, 5, 4, 3,
    4, 5, 6, 6, 7, 4,
    7, 6, 1, 1, 0, 7,
    0, 3, 4, 4, 7, 0,
    1, 6, 5, 5, 2, 1
};

cube.setIndices(indices);
cube.setVertices(vertices);

“原型”: enter image description here

Mesh类来自LibGDX,它由我修改(不太多)。 首先,我打电话给

GLES20.glEnable(GLES20.GL_DEPTH_TEST);

初始化(当然是在init上下文之后)。

渲染方法如下所示:

GLES20.glClearColor(0f, 0f, 0f, 1f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

shaderProgram.begin();
cube.render(shaderProgram, GLES20.GL_TRIANGLES, 0, 36);
shaderProgram.end();

最终结果是: enter image description here

我也玩过glDepthFunc,但我没有得到理想的结果。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

原因只有两个原因,

1)如果启用了剔除并且三角形的法线法线方向相反,则不会渲染三角形。使用交叉积来计算面三角形的法线。

2)如果深度函数错误。

要计算三角形的面/面法线,请参阅http://fullonsoftware.co.uk/snippets/content/Math_-_Calculating_Face_Normals.pdf

答案 1 :(得分:0)

答案是,我忘了在创建Open GL上下文时设置深度缓冲区大小:

setEGLConfigChooser(8, 8, 8, 8, 16, 0);

此外,near值应为> 0,所以我把它设置为1。