`
HCQmaker
  • 浏览: 46858 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

(废弃)JOGL入门 第5课

阅读更多
声明:   
   本来是想写点东西,记录学习的过程,并希望能帮助同我一样刚刚学习JOGL的朋友们
    可是由于没有明确目的,好心做了坏事,在这里先声明,本来是学习基本的JOGL,在
    学习过程中却把朋友们带入到了JOGL+GL4java中,基本的没学扎实,这是很错误的.


本来想直接学习了JOGL,可是到这一节就不知道怎么弄图片了,
哎郁闷了,怎么办呢?又和NeHe见面了
你可以在
http://jerome.jouvie.free.fr/OpenGl/Tutorials/Tutorial5.php
找到我们将要讲的内容同时也是JOGL,GL4java的结合,
那里有很多代码可以下载来,
我推荐大家到那里学习,顺便可以学学英语
很不错的

这里我们现在要引入一个新的包
BaseCode.jar
可以在
http://jerome.jouvie.free.fr/downloads/OpenGl/BaseCode/BaseCode2-2.2.2-jar.rar
下载
解压后会有很多相同的jar包,那要那个呢?
BaseCode2-2.2.2-jar\BaseCode-jar\Opti\JSR-231\BaseCode.jar
大小为:523KB 为什么呢?
如果引用不对,错误就来了
这里,引入之后由于GL4java,纹理可以支持PNG, BMP, JPG 和 GIF

接下来的学习就容易多了
现在只能重写全部代码

import java.awt.Dimension;
import java.awt.event.*;

import javax.swing.JOptionPane;


import org.jouvieje.io.Stream;
import org.jouvieje.picture.*;
import org.jouvieje.renderer.*;
import org.jouvieje.scene.*;
import org.jouvieje.texture.*;
import org.jouvieje.util.launcher.*;
import org.jouvieje.util.launcher.Settings.Renderer;

public class JOGL05 implements IScene, KeyListener, MouseListener, MouseMotionListener
{
public static void main(String[] args)
{
Dimension screen=new Dimension(800,600);//设置窗口的大小
Settings fr=new Settings(Renderer.JSR231);
fr.setSceneDimension(screen);
Launcher.loadScene("JOGL05", JOGL05.class, fr);
}
float zOffset = -6.0f;

float xRot; //旋转用

//用于存储纹理
Texture[] texture = new Texture[3];
int filter;

//重绘函数
public void reshape(IGLRenderer glRenderer, int x, int y, int width, int height)
{
final IGL gl   = glRenderer.getGL();
final IGLU glu = glRenderer.getGLU();

if(height <= 0) height = 1;

gl.glViewport(0, 0, width, height);

gl.glMatrixMode(IGL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, width / height, 0.1f, 1000.0f);
gl.glMatrixMode(IGL.GL_MODELVIEW);
gl.glLoadIdentity();
}
   //初始函数
public void init(IGLRenderer glRenderer)
{
ISceneTarget canvas = glRenderer.getSceneTarget();


canvas.addKeyListener(this);
canvas.addMouseListener(this);
canvas.addMouseMotionListener(this);

final IGL gl = glRenderer.getGL();

//载入纹理
if(!loadTextures(glRenderer))
{
JOptionPane.showMessageDialog(null, "纹理载入失败");
System.exit(1);
}
//使用2D纹理
gl.glEnable(IGL.GL_TEXTURE_2D);

gl.glShadeModel(IGL.GL_SMOOTH); //平滑处理
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClearDepth(1.0); //允许清除深度缓存
gl.glDepthFunc(IGL.GL_LEQUAL); //缓存测试类型
gl.glEnable(IGL.GL_DEPTH_TEST); //允许深度测试

gl.glHint(IGL.GL_PERSPECTIVE_CORRECTION_HINT, IGL.GL_NICEST);


//消隐
gl.glCullFace(IGL.GL_BACK);
gl.glEnable(IGL.GL_CULL_FACE);

//循环
canvas.startRenderingLoop();
}
   //此函数实现纹理的载入,支持PNG, BMP, JPG 和 GIF
public boolean loadTextures(IGLRenderer glRenderer)
{
texture = new Texture[3];
TextureLoader textureLoader = new TextureLoader(glRenderer);


Picture picture = PictureLoader.read(new Stream("/data/glass.png"));

texture[0] = textureLoader.loadTexture2D(picture, false, IGL.GL_NEAREST, IGL.GL_NEAREST);

texture[1] = textureLoader.loadTexture2D(picture, false, IGL.GL_LINEAR, IGL.GL_LINEAR);

texture[2] = textureLoader.loadTexture2D(picture, true, IGL.GL_LINEAR_MIPMAP_LINEAR, IGL.GL_LINEAR_MIPMAP_LINEAR);

for(int i = 0; i < texture.length; i++)
{
if(!textureLoader.isTexture(texture[i]))
return false;
}
return true;
}


public void render(IGLRenderer glRenderer)
{
final IGL gl = glRenderer.getGL();

gl.glClear(IGL.GL_COLOR_BUFFER_BIT | IGL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslate(0.0f, 0.0f, zOffset); //向屏幕里面移动zOffset个单位
gl.glRotate(xRot, 1.0f, 1.0f, 0.0f); //绕x轴旋转

//选择纹理
gl.glBindTexture(IGL.GL_TEXTURE_2D, texture[filter].id);

//绘制1个矩形
gl.glBegin(IGL.GL_QUADS);
  //
gl.glTexCoord(0.0f, 1.0f); gl.glVertex( 1.0f, 1.0f, 1.0f);    //V2
gl.glTexCoord(0.0f, 0.0f); gl.glVertex( 1.0f,-1.0f, 1.0f);    //V1
gl.glTexCoord(1.0f, 0.0f); gl.glVertex( 1.0f,-1.0f,-1.0f);    //V3
gl.glTexCoord(1.0f, 1.0f); gl.glVertex( 1.0f, 1.0f,-1.0f);    //V4
  //
gl.glTexCoord(0.0f, 1.0f); gl.glVertex( 1.0f, 1.0f,-1.0f);    //V4
gl.glTexCoord(0.0f, 0.0f); gl.glVertex( 1.0f,-1.0f,-1.0f);    //V3
gl.glTexCoord(1.0f, 0.0f); gl.glVertex(-1.0f,-1.0f,-1.0f);    //V5
gl.glTexCoord(1.0f, 1.0f); gl.glVertex(-1.0f, 1.0f,-1.0f);    //V6
  //
gl.glTexCoord(0.0f, 1.0f); gl.glVertex(-1.0f, 1.0f,-1.0f);    //V6
gl.glTexCoord(0.0f, 0.0f); gl.glVertex(-1.0f,-1.0f,-1.0f);    //V5
gl.glTexCoord(1.0f, 0.0f); gl.glVertex(-1.0f,-1.0f, 1.0f);    //V7
gl.glTexCoord(1.0f, 1.0f); gl.glVertex(-1.0f, 1.0f, 1.0f);    //V8
  //
gl.glTexCoord(0.0f, 1.0f); gl.glVertex(-1.0f, 1.0f, 1.0f);    //V8
gl.glTexCoord(0.0f, 0.0f); gl.glVertex(-1.0f,-1.0f, 1.0f);    //V7
gl.glTexCoord(1.0f, 0.0f); gl.glVertex( 1.0f,-1.0f, 1.0f);    //V1
gl.glTexCoord(1.0f, 1.0f); gl.glVertex( 1.0f, 1.0f, 1.0f);    //V2
  //
gl.glTexCoord(0.0f, 1.0f); gl.glVertex(-1.0f, 1.0f,-1.0f);    //V6
gl.glTexCoord(0.0f, 0.0f); gl.glVertex(-1.0f, 1.0f, 1.0f);    //V8
gl.glTexCoord(1.0f, 0.0f); gl.glVertex( 1.0f, 1.0f, 1.0f);    //V2
gl.glTexCoord(1.0f, 1.0f); gl.glVertex( 1.0f, 1.0f,-1.0f);    //V4
  //
gl.glTexCoord(0.0f, 1.0f); gl.glVertex(-1.0f,-1.0f, 1.0f);    //V7
gl.glTexCoord(0.0f, 0.0f); gl.glVertex(-1.0f,-1.0f,-1.0f);    //V5
gl.glTexCoord(1.0f, 0.0f); gl.glVertex( 1.0f,-1.0f,-1.0f);    //V3
gl.glTexCoord(1.0f, 1.0f); gl.glVertex( 1.0f,-1.0f, 1.0f);    //V1
gl.glEnd();

xRot+=0.1f;
if(xRot>360)
{
xRot=0;
}

}



public void keyReleased(KeyEvent ke)
{
switch(ke.getKeyCode())
{
case KeyEvent.VK_ESCAPE:
System.exit(0);
break;
case KeyEvent.VK_K://用于选择各种纹理,看效果有什么差别
if(filter<2)
{
filter++;
}else{
filter=0;
}
break;
default:
break;
}
}
public void keyPressed(KeyEvent ke)
{
}
public void keyTyped(KeyEvent ke)
{
}
public void mouseEntered(MouseEvent me)
{

}
public void mouseClicked(MouseEvent me)
{

}
public void mouseExited(MouseEvent me)
{

}
public void mousePressed(MouseEvent me)
{
}
public void mouseReleased(MouseEvent me)
{
}
public void mouseMoved(MouseEvent me)
{
}
public void mouseDragged(MouseEvent me)
{
}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics