2

我是一个完全的菜鸟,我正在尝试展示我在 opengl(Blender)的 3d 建模程序中构建的一个小潜艇。

潜艇是用一个长圆柱体建造的,圆柱体的末端有一个相交的球体。

我遇到的问题是,当我查看结果时,我可以通过圆柱体看到整个球体。我还可以通过球体看到圆柱体的末端。当我打开照明时,就会出现这种情况。我正在使用环境光和漫反射光。我只想看到圆柱体外侧的一半球体,不想看到任何内脏。

我进行了面部剔除,它删除了两个对象的正面,但我清楚地看到了球体。

下面我粘贴了我的 onSurfaceCreated 函数,我在其中设置了所有 opengl 参数。任何建议表示赞赏!

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    //
    gl.glEnable(GL10.GL_DEPTH_TEST);
    //gl.glMatrixMode(GL10.GL_PROJECTION);

    gl.glMatrixMode(GL10.GL_MODELVIEW);

    gl.glEnable(GL10.GL_POLYGON_OFFSET_FILL);

    gl.glEnable(GL10.GL_LIGHTING);
    gl.glEnable(GL10.GL_LIGHT0);

    // Define the ambient component of the first light
    float[] light0Ambient = {0.1f, 0.1f, 0.1f, 1.0f};        
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, FloatBufferFromFloatArray(light0Ambient, 4));

    // Define the diffuse component of the first light
    float[] light0Diffuse = {0.7f, 0.7f, 0.7f, 1.0f};
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, FloatBufferFromFloatArray(light0Diffuse, 4));

    // Define the specular component and shininess of the first light
    float[] light0Specular = {0.7f, 0.7f, 0.7f, 1.0f};
    float light0Shininess = 0.4f;
    //gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPECULAR, FloatBufferFromFloatArray(light0Specular, 4));        

    // Define the position of the first light
    float[] light0Position = {1.0f, 0.0f, 0.0f, 0.0f};
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_POSITION, FloatBufferFromFloatArray(light0Position, 4)); 

    // Define a direction vector for the light, this one points correct down the Z axis
    float[] light0Direction = {0.0f, 0.0f, -1.0f};
    //gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPOT_DIRECTION, FloatBufferFromFloatArray(light0Direction, 3));

    // Define a cutoff angle. This defines a 90° field of vision, since the cutoff
    // is number of degrees to each side of an imaginary line drawn from the light's
    // position along the vector supplied in GL_SPOT_DIRECTION above
    //gl.glLightf(gl.GL_LIGHT0, gl.GL_SPOT_CUTOFF, 180.0f);

    gl.glEnable(GL10.GL_CULL_FACE);
    // which is the front? the one which is drawn counter clockwise
    gl.glFrontFace(GL10.GL_CCW);
    // which one should NOT be drawn
    gl.glCullFace(GL10.GL_BACK);

    gl.glClearDepthf(10f);
    gl.glPolygonOffset(1.0f, 2);

    initShape();

    gl.glScalef(0.5f, 0.5f, 0.5f);
}
4

5 回答 5

1

我明白了,您仍在考虑“初始化一些场景图”。这不是 OpenGL 的工作方式(哎呀,这是我连续第三次写这个作为答案)。您在 onSurfaceCreated 中所做的所有事情实际上都属于显示例程。OpenGL 不是场景图。在绘制需要该状态的内容之前,您可以设置所有需要的状态。

我看到你在那里有那个功能“initShape”。我不认为这符合你的意图。

于 2011-01-09T22:56:58.153 回答
1

您是否尝试过检查是否是背面剔除问题?通过更改glEnable(GL_CULL_FACE)toglDisable来检查它,只是为了检查它绝对不是那样的。在同一个网格上可能有两个缠绕顺序,因此剔除对于模型的一部分可能是正确的,但对于另一部分是错误的 - 最简单的方法是禁用它以确保这不是问题。

是不是因为某种原因,您的表面可能是在没有深度缓冲区的情况下创建的?检查 EGLConfig 参数以确保不是这种情况。通常默认情况下它会使用深度缓冲区创建,但可以覆盖该行为。

此外,用永远不会看到的内部面建模事物不会对您的实时性能有好处。您应该考虑在搅拌机中使用布尔“或”操作,至少可以摆脱内部面,但最终最好在制作模型时非常小心并注意它们的拓扑结构,不仅仅是为了多边形数量,还有它们的好坏组合成一个三角形条带(这不能成为您现在遇到的问题的借口 - 这只是未来的说明)

于 2011-01-09T23:23:04.630 回答
1

您确定您有启用深度缓冲区的 EGL 上下文吗?如果您使用 GLSurfaceView,您可能正在寻找类似 SimpleEGLConfigChooser(false) 的东西,它应该是 SimpleEGLConfigChooser(true)。

于 2011-01-09T23:59:01.447 回答
1

让我们看看你的 onDrawFrame()?你的投影是什么,它可能是翻转的法线和一个混乱的投影,让它看起来很有趣。

您的深度缓冲区或深度测试也可能出现问题。

编辑:看起来深度测试不是您的问题,因为您可以从与球体相交的多边形中看到深度剔除。看起来你的几何是问题所在。

我会让你的相机可以移动,然后你可以环顾四周,找出它出了什么问题。

于 2011-01-10T00:15:41.590 回答
0

如果您正在使用纹理,请查看您正在使用的混合功能。重叠的像素可能会像叠加效果那样成倍增加,而不是像我想的那样被覆盖。

于 2012-05-01T11:53:30.653 回答