2011-01-09 1 views
2

전 멍청한 녀석이고 OpenGL (Blender)에서 3D 모델링 프로그램으로 만든 잠수함을 표시하려고합니다.Android 및 OpenGL - 다른 개체를 통해 개체보기

잠수함은 구형의 끝이 교차하는 긴 원통을 사용하여 만들어졌습니다.

내가 얻는 문제는 결과를 보면 실린더를 통해 전체 구체를 볼 수 있다는 것입니다. 또한 구를 통해 원통의 끝을 볼 수 있습니다. 조명이 켜지면 나타납니다. 주변 조명과 확산 조명을 사용하고 있습니다. 실린더의 바깥쪽에 반구를보고 싶습니다. 아무 것도 볼 수 없습니다.

나는 얼굴을 도려내는데 두 물체의 앞면을 제거하지만 구가 분명하게 보입니다.

아래 나는 모든 OpenGL 매개 변수를 설정하는 내 onSurfaceCreated 함수를 붙여 넣었습니다. 모든 제안을 부탁드립니다!

@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); 
} 
+0

스크린 샷을 게시 할 수 있습니까? – ChrisF

+0

법선과 같은 소리가 반대로 나옵니다. – Dave

+0

http://img696.imageshack.us/i/13043028.png/ –

답변

1

뒷면의 도용 문제인지 확인해 보셨습니까? glEnable(GL_CULL_FACE)glDisable으로 변경하여 확인하십시오. 확실히 확인하지 않으려 고합니다. 동일한 메시에서 두 와인딩 주문을 모두 처리 할 수 ​​있으므로 도려 내기는 모델의 한 부분에 대해서는 올바를 수 있지만 다른 부분에 대해서는 잘못 될 수 있습니다. 문제가 아닌지 확인하는 것이 가장 쉽습니다.

어떤 이유로 든 표면이 깊이 버퍼없이 만들어 졌을 수 있습니까? EGLConfig 매개 변수가 맞는지 확인하십시오. 일반적으로 기본적으로 깊이 버퍼로 만들어 지지만 해당 동작을 무시할 수 있습니다.

내 얼굴이 보이지 않는 모델링 작업도 실시간 성능을 위해 좋은 일을하지 않을 것입니다. 블렌더에서 부울 '또는'연산을 사용하여 적어도 내부면을 제거하는 것을 고려해야하지만, 궁극적으로 폴리 카운트뿐 아니라 폴리곤 수식에 대한주의와 관심이 많은 모델을 만드는 것이 가장 좋습니다. 삼각형 스트립에 맞추어 라. (지금 당장 얻고있는 문제는 변명하지 않는다. 그것은 미래를위한 노트 일 뿐이다.)

+0

얼굴 도려기를 제거하고 내부면을 없애고 멋지게 보였습니다. 나는 얼굴을 도려내기로 돌 렸고 여전히 좋아 보였으므로 내면의 얼굴이었을 것입니다. 그래도 EGLConfig 매개 변수는 무엇입니까? 나는 웹상의 어떤 좋은 자료도 보지 못했다. –

+0

며칠 동안 떨어져 있습니다. EGLConfig는 저수준 EGL 유형이며, javax.microedition.khronos.egl.EGL10.eglGetConfigAttrib'와 같은 정적 메소드에서 사용하여 앱이 작동해야하는 것을 찾을 수 있습니다. 사용하는 것은 다소 힘들지만, 렌더러가 가지고있는 기능을 정확히 아는 것은 정말 유용합니다. –

1

저는 "일부 장면 그래프 초기화"라는 측면에서 생각하고 있습니다. 그것은 OpenGL이 작동하는 방식이 아닙니다. (예, 대답으로이 세 번째로 연속해서 쓰는 것입니다.) onSurfaceCreated에서 수행 한 모든 작업은 실제로 디스플레이 루틴에 속합니다. OpenGL은 장면 그래프가 아닙니다. 그 상태를 필요로하는 물건을 그리기 전에 필요한 모든 상태를 설정합니다.

"initShape"함수가 있습니다. 나는 이것이 당신이 원하는 것을하지 않는다고 생각합니다.

+0

initShape는 도형 그리기에 사용되는 모든 정점, 인덱스 및 법선을 포함하는 파일을 열뿐입니다. 내 onSurfaceCreated의 모든 내용이 실제로 onDrawFrame에 속해 있습니까? 필자가 실제로 본 모든 예는 실제로 이런 방식으로 수행됩니다. :) 나는 모두가 함께 할 수 있도록 앞으로 나아갈 것이다. 실린더 문제의 구면은 어떻게됩니까? 이 문제가 해결 될 것이라고 생각하십니까? –

+0

onStart()와 같이 지오메트리를로드하는 데 더 좋은 장소가있을 것입니다. 항상 여러 개의 서페이스가있을 수 있으므로 실제로 각 서페이스에 대한 지오메트리를 다시로드 하시겠습니까? – HaMMeReD

+0

네, 그 튜토리얼을 알고 있습니다. 그들은 모두 그것을 틀리게했다. OpenGL은 상태 머신입니다. 즉, 상태 벡터를 직전에 필요한 것에 다시 설정해야합니다. 그렇지 않으면 오래 전에 일어난 일이 당신의 엉덩이를 물 수도 있습니다. 물론 텍스처를로드하거나 버텍스 버퍼 오브젝트를 데이터로 채우는 것과 같은 일회성 초기화에 적합한 것들이 있습니다. 그러나 뷰포트 및 프로젝션 설정을 포함하여 코드에서 수행하는 작업은 모두 디스플레이 기능에 속합니다. – datenwolf

1

깊이 버퍼가 활성화 된 EGL 컨텍스트를 사용하고 있습니까? GLSurfaceView를 사용한다면 SimpleEGLConfigChooser (false)와 같은 것을 찾고있을 것입니다. SimpleEGLConfigChooser (true) 여야합니다.

+0

EGL 구성이란 무엇입니까? 나는 안드로이드 참조를 살펴 봤지만 그 설명은 그리 좋지 않다 (실제로 아무 것도 볼 수 없다). SimpleEGLConfigChooser 대신, 가능한 경우 setEGLConfigChooser를 의미합니까? 나는 세트를 시험해 보았다. 그리고 그것이 차이를 만드는 것처럼 보인다. 그러나 나는 그것이했던 것에 관해 나의 손가락을 아주 댈 수 없다. :). 제안 해줘서 고마워. –

+0

위키에서 : "EGL은 OpenGL ES [...]와 기본 네이티브 플랫폼 윈도우 시스템 간의 인터페이스로, 그래픽 컨텍스트 관리, 표면/버퍼 바인딩 및 렌더링 동기화를 처리합니다." 즉, OpenGL ES에 색상/깊이/알파/스텐실 버퍼 크기를 포함하여 '세계'가 존재합니다. 더 많은 것을 알고 싶다면 GLSurfaceView 소스 코드를 보지 말고 : P, google을 참고하십시오. – Gilead

1

귀하의 onDrawFrame()을 보시겠습니까? 당신의 투영은 무엇입니까, 그것은 뒤집힌 법선과 엉망인 투영으로 재미있을 수 있습니다.

깊이 버퍼 또는 깊이 테스트에 대한 문제도 있습니다.

편집 : 구형과 교차하는 다각형에서 심도있는 선명함을 볼 수 있기 때문에 깊이 테스트가 문제가 아닌 것처럼 보입니다. 기하학이 문제인 것처럼 보입니다.

카메라를 움직일 수 있도록 만들면 주변을 둘러보고 무엇이 엉망이되는지 파악할 수 있습니다.

0

질감을 사용하는 경우 사용중인 혼합 기능을 살펴보십시오. 중복되는 픽셀이 내가 뭘 원하는지 덮어 쓰기가 아닌 오버레이 효과처럼 곱해질 수 있습니다.

관련 문제