GL_DEPTH_TEST 无效
GL_DEPTH_TEST doens't work
所以,这是我的 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);
"Prototype":
Mesh class来自LibGDX,是我修改的(不是太多)。
首先,我打电话给
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
在初始化时(当然是在初始化上下文之后)。
渲染方法如下所示:
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();
最后的结果是:
我也玩过 glDepthFunc,但没有得到想要的结果。
我做错了什么?
只有 2 个原因,
1) 如果您启用了剔除并且三角形的面法线方向相反,那么三角形将不会 rendered.Use 叉积到计算三角形的面法线。
2) 如果深度函数错误。
要计算三角形的 face/surface 法线,请参考 http://fullonsoftware.co.uk/snippets/content/Math_-_Calculating_Face_Normals.pdf
答案是,我忘记在创建 Open GL 上下文时设置深度缓冲区大小:
setEGLConfigChooser(8, 8, 8, 8, 16, 0);
此外,near
值应该 > 0,所以我将其设置为 1。
所以,这是我的 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);
"Prototype":
Mesh class来自LibGDX,是我修改的(不是太多)。 首先,我打电话给
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
在初始化时(当然是在初始化上下文之后)。
渲染方法如下所示:
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();
最后的结果是:
我也玩过 glDepthFunc,但没有得到想要的结果。
我做错了什么?
只有 2 个原因,
1) 如果您启用了剔除并且三角形的面法线方向相反,那么三角形将不会 rendered.Use 叉积到计算三角形的面法线。
2) 如果深度函数错误。
要计算三角形的 face/surface 法线,请参考 http://fullonsoftware.co.uk/snippets/content/Math_-_Calculating_Face_Normals.pdf
答案是,我忘记在创建 Open GL 上下文时设置深度缓冲区大小:
setEGLConfigChooser(8, 8, 8, 8, 16, 0);
此外,near
值应该 > 0,所以我将其设置为 1。