2011-09-17 4 views
1

삼각형 (안드로이드)을 만들었으며 아래에 주어진 꼭지점 크기, 뷰포트 크기 & 투영 투영 크기를 지정했습니다.뷰포트 및 평행 투영에 대한 질문

  • glsurfaceview.getWidth() = 320
  • glsurfaceview.getHeight() = 480

감안할 :

vertices.put(new float[] { 0.0f, 0.0f, 
          319.0f, 0.0f, 
        160.0f, 479.0f }); 

gl10.glViewport(0, 0, 160, 480); 
gl10.glOrthof(0, 160, 0, 480, 1, -1); 

화면의 실제 해상도는 320 * 480이고, 볼 아래는 에뮬레이터에서 수신 한 출력의 스냅 샷입니다. ACTUAL RESULT

내가 이해할 수없는 것은 화면의 절반만으로 뷰포트를 설정했으며 삼각형의 절반 만 볼 것으로 예상했습니다 (뷰포트 영역을 초과하는 것이 잘리지 않으면 안됩니다). 난 그냥이 문제에 대한 이유를 알아낼 수

Expected result

내가 기대 한 사진이 아래 감안할. 이걸 좀 도와 주실 래요? 나는이 설명을 제공 할 수있는 컴퓨터 그래픽의 측면에서 '뷰포트'의 정의를 찾을 수 없습니다 동안 아래

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    rand = new Random(); //Random number generator 

    glsurfaceview = new GLSurfaceView(this); 

    glsurfaceview.setRenderer(this); 

    setContentView(glsurfaceview); 
} 



@Override 
public void onSurfaceCreated(GL10 gl10, EGLConfig eglconfig) { 
    Log.v("#MYAPP", "MyCanonActivity : Inside onSurfaceCreated"); 

    byteBuffer = ByteBuffer.allocateDirect(3 * 2 * 4); 
    byteBuffer.order(ByteOrder.nativeOrder()); 
    vertices = byteBuffer.asFloatBuffer(); 
    vertices.put(new float[] { 0.0f, 0.0f, 
           319.0f, 0.0f, 
           160.0f, 479.0f }); 

    vertices.flip(); 


} 

@Override 
public void onDrawFrame(GL10 gl10) { 

    gl10.glViewport(0, 0, 160, 480); 
    gl10.glClearColor(0,0,0,1); 
    gl10.glClear(GL10.GL_COLOR_BUFFER_BIT); 

    gl10.glMatrixMode(GL10.GL_PROJECTION); 
    gl10.glLoadIdentity(); 
    gl10.glOrthof(0, 160, 0, 480, 1, -1); 
    gl10.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl10.glVertexPointer(2, GL10.GL_FLOAT, 0, vertices); 
    gl10.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 
} 

@Override 
public void onSurfaceChanged(GL10 gl10, int width, int height) { 
    Log.v("#MYAPP", "MyCanonActivity : Inside onSurfaceChanged"); 
} 


@Override 
public void onResume() { 
    super.onResume(); 
    glsurfaceview.onResume(); //Start rendering thread also 
    Log.v("#MYAPP", "MyCanonActivity : onResume"); 


} 

@Override 
public void onPause() { 
    super.onPause(); 
    glsurfaceview.onPause(); 
    Log.v("#MYAPP", "MyCanonActivity : onPause"); 
} 
+0

명확히하기 위해 '뷰포트'의 기능을 묻고 있습니까? – Kerry

+0

안녕하세요, 내 이해하기에, 뷰포트는 우리가 화면 내에서 지정하는 그림 영역입니다. 그래서 제 질문은 뷰포트를 화면 크기의 절반으로 설정하면 (정확한 스펙에 대한 원래의 질문을 참조하십시오), 뷰포트를 뷰포트 내부에 그려 놓은 후에 조작 할 것으로 예상됩니다. 그래서이 경우, 내가 그린 삼각형이 뷰포트를 오버 슛합니다. 나는 그 질문에 내가 분명하기를 희망한다. OpenGL에서 시작한 나는 순진 할 수도 있습니다. 왜 이런 일이 일어 났는지 말해 줄 수 있다면, 내가 찾는 답이 될 것입니다. – Raj

답변

0

, 내가 일하고 실제 코드입니다.

뷰포트는 실제로보기 영역을 잘라냅니다. 포트 홀 중 하나를 바라 보는 배 안에 있다고 상상해보십시오. 보트 외부의 모습은 항구 구멍의 크기에 의해 제한됩니다. 즉, 훨씬 더 큰 외부 세계에 대한 전망은 항구 구멍에 의해 '잘립니다'. 컴퓨터 그래픽과 관련하여 뷰 포트는 뷰포트가 가단 성 (malleable), 즉 쉽게 변경할 수 있다는 점을 제외하고는 동일한 방식으로 작동합니다.

위에서 설명한 클리핑은 예상 한대로이므로 삼각형을 뷰포트 내부에 맞게 그리도록 강요하지 않습니다. 삼각형을 뷰포트 안에 완전히 그려 넣으려면 꼭지점의 좌표를 뷰포트로 변환해야합니다.

+0

안녕하세요, 삼각형이 뷰포트 내부에 들어갈 것으로 기대하지 않았습니다. 삼각형의 절반이 잘려서 (두 번째 그림에 표시된 것과 같은 뷰를 제공하기를 기대합니다). 그래서 여기 내 질문은 클리핑이 발생하지 않은 이유입니다. opengl에서 이런 종류의 클리핑 (clipping)이 발생하지 않는다고 말하고 있습니까? 나는 아직도 뭔가를 놓치고 있습니까? – Raj

0

사실 귀하의 가정은 정확하며 귀하의 사진은 실제로 귀하의 코드 스 니펫에 주어진 두 번째 사진처럼 보일 것입니다. 전체 크기의 삼각형을 그린 후에 프레임 버퍼 (전체 크기를 가짐)를 지우지 않았기 때문에 실제로 렌더링은 이전 패스의 전체 삼각형과 그 위에 렌더링 된 절반을 포함 할 수 있습니다.

그리고 완전히 다른 결과를 줄 수도 있지만 정확한 매트릭스 스택 (투영법)을 호출하여 매트릭스 스택을 엉망으로 만들지 않았 으면 좋겠습니다.

+0

안녕하세요, Christian Rau, 저는 프로젝션 매트릭스에서만 glOrtho를 설정하고 있습니다. B/W 원래 질문에 코드를 추가했습니다. 코드에서 뭔가 빠졌습니까? – Raj

+0

@Raj는 합리적인 것 같습니다. –