2014-09-21 79 views
0

我其次才能安裝這些步驟,並創建我的第一個項目:
setup
tutorial
Jogl 2.2.1 windows工作教程?

這裏是有問題的代碼:

主類:

/** 
* 
*/ 

package name.wadewalker.tutorial; 

import java.awt.*; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.media.opengl.*; 
import javax.media.opengl.awt.GLCanvas; 
import javax.media.opengl.glu.GLU; 

/** 
* @author PTOSH 
* 
*/ 
public class openGL{ 

    /** 
    * @param args 
    */ 
    GLU glu; 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     GLProfile glp = GLProfile.getDefault(); 
     GLProfile.initSingleton(); 
     GLCapabilities CAPS = new GLCapabilities(glp); 
     GLCanvas CANVAS = new GLCanvas(CAPS); 
     CANVAS.addGLEventListener(new newLstn()); 
     Frame FRAME = new Frame("AWT WINDOW TEST"); 
     FRAME.setSize(1300, 700); 
     FRAME.add(CANVAS); 
     FRAME.addWindowListener(new WindowAdapter(){ 
      public void windowClosing(WindowEvent E){ 
       System.exit(0); 
      } 
     }); 
     FRAME.setVisible(true); 
    }  
} 

GLEventListener:

package name.wadewalker.tutorial; 

import javax.media.opengl.GL; 
import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.fixedfunc.GLMatrixFunc; 
import javax.media.opengl.glu.GLU; 

public class newLstn implements GLEventListener { 
    private GL2 gl; 
    private GLU glu;  
    @Override 
    public void display(GLAutoDrawable arg0) { 
     // TODO Auto-generated method stub 
     gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
     gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); 
     gl.glClearColor(0f,0f,0f,0f); 

     gl.glBegin(GL.GL_TRIANGLES); 
      // Font-face triangle 
      gl.glColor3f(1.0f, 0.0f, 0.0f); // Red 
      gl.glVertex3f(0.0f, 0.5f, 0.0f); 
//  gl.glColor3f(0.0f, 1.0f, 0.0f); // Green 
      gl.glVertex3f(-0.5f, -0.5f, 0.5f); 
//  gl.glColor3f(0.0f, 0.0f, 1.0f); // Blue 
      gl.glVertex3f(0.5f, -0.5f, 0.5f); 

      // Right-face triangle 
//  gl.glColor3f(1.0f, 0.0f, 0.0f); // Red 
      gl.glVertex3f(0.0f, 0.5f, 0.0f); 
//  gl.glColor3f(0.0f, 0.0f, 1.0f); // Blue 
      gl.glVertex3f(0.5f, -0.5f, 0.5f); 
//  gl.glColor3f(0.0f, 1.0f, 0.0f); // Green 
      gl.glVertex3f(0.5f, -0.5f, -0.5f); 

      // Back-face triangle 
//  gl.glColor3f(1.0f, 0.0f, 0.0f); // Red 
//  gl.glVertex3f(0.0f, 1.0f, 0.0f); 
//  gl.glColor3f(0.0f, 1.0f, 0.0f); // Green 
//  gl.glVertex3f(1.0f, -1.0f, -1.0f); 
//  gl.glColor3f(0.0f, 0.0f, 1.0f); // Blue 
//  gl.glVertex3f(-1.0f, -1.0f, -1.0f); 
// 
//  // Left-face triangle 
//  gl.glColor3f(1.0f, 0.0f, 0.0f); // Red 
//  gl.glVertex3f(0.0f, 1.0f, 0.0f); 
//  gl.glColor3f(0.0f, 0.0f, 1.0f); // Blue 
//  gl.glVertex3f(-1.0f, -1.0f, -1.0f); 
//  gl.glColor3f(0.0f, 1.0f, 0.0f); // Green 
//  gl.glVertex3f(-1.0f, -1.0f, 1.0f); 

     gl.glEnd(); 
     gl.glFlush(); 

      // ----- Render the Pyramid ----- 
      gl.glLoadIdentity();     // reset the model-view matrix 
      gl.glTranslatef(-0.6f, 0.0f, 0.0f); // translate left and into the screen 
      gl.glRotatef(15, -0.2f, 1.0f, 0.0f); // rotate about the y-axis 
    } 
    @Override 
    public void dispose(GLAutoDrawable arg0) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void init(GLAutoDrawable arg0) { 
     // TODO Auto-generated method stub 
      gl = arg0.getGL().getGL2();  // get the OpenGL graphics context 
      glu = new GLU();       // get GL Utilities 
      gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // set background (clear) color 
      gl.glClearDepth(1.0f);  // set clear depth value to farthest 
      gl.glEnable(GL.GL_DEPTH_TEST); // enables depth testing 
      gl.glEnable(GL.GL_CULL_FACE_MODE); 
      gl.glDepthFunc(GL.GL_LEQUAL); // the type of depth test to do 
      gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); // best perspective correction 
//  gl.glShadeModel(0); // blends colors nicely, and smoothes out lighting 

    } 
    @Override 
    public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, 
      int arg4) { 
//  float red = 0.0f; float green = 0.0f; float blue = 0.0f; 
//// 
////   gl = arg0.getGL().getGL2(); 
//// 
////   gl.glClear(GL.GL_COLOR_BUFFER_BIT); 
//// 
//  gl.glPointSize(5.0f); 
// 
//  for (int i=0; i<50; i++) { 
// 
//  red -= .09f; green -= .12f; blue -= .15f; 
// 
//  if (red < 0.15) red = 1.0f; if (green < 0.15) green = 1.0f; if (blue < 0.15) blue = 1.0f; 
// 
//  gl.glColor3f(red, green, blue); 
//  gl.glBegin(GL.GL_POINTS); gl.glVertex2i((i*10), 150); gl.glEnd(); } 
//  TODO Auto-generated method stub 
     glu.gluPerspective(45.0, 15, 0.1, 100.0); // fovy, aspect, zNear, zFar 
    } 
} 

我從教程中獲取源代碼並對其進行了修改,我的目的是開始繪製簡單的3d形狀。我執行代碼時出現問題,顯然不是渲染深度。我還注意到,該教程是爲JOGL 2.0和代碼的某些部分不再工作:「gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT,GL.GL_NICEST);」
所以我必須刪除或評論這部分代碼才能看到2D中的形狀。 如果有人能告訴我一個很好的更新教程的路徑,或者給我一些幫助來理解我所面臨的問題,請給予幫助。 謝謝你的幫助和努力。

回答

2

你的顯示功能具有線:

gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

這將重置兩個模型視圖和投影矩陣的身份,所以在下面,你剪裁空間直接繪製。這意味着根本沒有透視效果。

在你reshape回調,你有

glu.gluPerspective(45.0, 15, 0.1, 100.0); // fovy, aspect, zNear, zFar 

其目的是要建立一些透視變換。但是,當你在顯示功能中覆蓋該矩陣時,它不起作用。但是,你也使用它錯了。 gluPerspective()乘以頂部矩陣fo 當前選定的矩陣堆棧通過一些透視變換。

你應該做的是一樣的東西

gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    glu.gluPerspective(45.0, 15, 0.1, 100.0); // fovy, aspect, zNear, zFar 
    gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); 
在重塑功能

,並完全從顯示功能刪除

gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION); 
    gl.glLoadIdentity(); 

但是,這不會給你可能預期的結果。因爲你將三角形的一部分畫出來,然後。

你的顯示功能與

 gl.glLoadIdentity();     // reset the model-view matrix 
     gl.glTranslatef(-0.6f, 0.0f, 0.0f); // translate left and into the screen 
     gl.glRotatef(15, -0.2f, 1.0f, 0.0f); // rotate about the y-axis 

該代碼最終沒有做任何事情。你完全誤解了openGL的工作原理。它不會爲您管理3D對象,您可以稍後在世界中轉移。它是一個渲染API。而OpenGL被設計成一個狀態機。您設置了一些渲染狀態,這會影響繪圖調用的最重要的狀態。在這裏,你設置了一些渲染狀態(模型視圖矩陣),但是當這個狀態有效時你什麼也不畫。您必須先在之前進行的變換,然後發出想要以這種方式變形的對象的繪圖。

請注意,到目前爲止,我所說的所有事情都是正確在您所鏈接的教程中使用。

此問題的另一個大問題是,您應該知道此代碼完全依賴於已棄用 GL。在現代GL中,您在這裏使用的幾乎所有GL功能都消失了。如果你現在在學習OpenGL,你應該考慮學習現代化的方法(現在不再那麼現代化了,我們現在可以使用可編程管線十年)。

+0

我同意derhass,Greg86並不真正瞭解OpenGL併成功破解了一個有效的代碼示例。 – gouessej 2014-09-21 18:21:40

+0

感謝您爲我的方式帶來光明,您是否有一些有用的資源來學習正確和現代的OpenGL編碼方式?是的,我正在學習和犯錯誤,我爲此道歉。 – Greg86 2014-09-21 20:18:18

+0

@ Greg86:你不需要道歉。而且我也不打算用我的答案冒犯你。就現代OpenGL而言,教程[arcsynthesis](http://www.arcsynthesis.org/gltut/)和[open.gl](http://open.gl)通常被認爲是好的。他們不處理java,很難。但實際上,GL部分並沒有太大的不同。但是,處理指針和C數據類型將會是一個問題。我不知道現代GL的好教程。 – derhass 2014-09-21 20:48:54