2011-09-17 14 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

、私が働いている実際のコードです。

ビューポートは確かに表示領域をクリップします。ポートホールの1つを見てボートの中にいるかどうかを想像してみてください。ボートの外側にあるものは、ポートホールのサイズによって制限されます。つまり、はるかに大きな外界のビューは、ポートホールによって「クリップ」されます。コンピュータ・グラフィックスに関するビュー・ポートは、ビューポートが可鍛性であること、すなわち容易に変更できることを除いて同様の働きをする。

このように、上で説明したクリッピングは予想どおりですが、三角形が描画されてビューポートに収まるよう強制されません。三角形をビューポート内に完全に描きたい場合は、頂点の座標をビューポートに変換する必要があります。

+0

こんにちは、三角形がビューポートの内側に収まるとは思っていませんでした。私は三角形の半分がクリップされることを期待しています(2番目の写真に示されているようなビューを提供する)。だからここで私の質問は、クリッピングが行われていない理由です。 openglでは、この種のクリッピングは起こらないと言っていますか(あなたが説明した現実の類推とは異なります)。私はまだ何かが欠けていますか? – Raj

0

実際にはあなたの前提は正しいものであり、あなたの写真は実際にあなたのコードスニペットの2番目のもののように見えるはずです。フルサイズの三角形を描画した後にフレームバッファーをクリアしていないことがあります。その結果、実際のレンダリングには前のパスからの三角形全体とその上にレンダリングされた半角形が含まれます。

ちなみに、正しい行列スタック(射影)を呼び出して、マトリックススタックを台無しにしていないことを願っていますが、これは全く異なる結果をもたらすかもしれません。

+0

こんにちはChristian Rau、私は投射行列でglOrthoを設定しています。 B/W元の質問に自分のコードを追加しました。コード内に何か不足していますか? – Raj

+0

@Rajは妥当なようです。 –

関連する問題