Android 和 OpenGL - 通过另一个对象查看对象

标签 android opengl-es light

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

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

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

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

下面我粘贴了 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);
}

最佳答案

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

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

使用永远不会被看到的内部面孔进行建模也不会对您的实时性能产生任何好处。您应该考虑在混合器中使用 bool “或”运算,至少可以消除内部面,但最终最好在制作模型时非常小心并注意其拓扑,不仅是为了多边形数量,还为了它们的效果组合成一个三角形带(这并不能成为您现在遇到的问题的借口 - 这只是为将来做准备)

关于Android 和 OpenGL - 通过另一个对象查看对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4641966/

相关文章:

android - 在我的 Activity 期间保持屏幕保持清醒

java - 具有多种不同 fragment 类型的 Android BaseFragment 类

java - 下载照片时遇到问题

android - 如何处理色键滤镜中的镜面高光?

algorithm - 有哪些算法可以检测光影及其参数?

c++ - 使用光敏电阻和串行通信控制光 - Arduino

android - 图片未从 Firebase 检索

c++ - 使用 Freetype 绘制文本轮廓

android - 旋转后, Sprite 和矩形位置在 Libgdx 中未对齐

javascript - 在 Vanilla wegl 中向变换立方体添加定向光