📄 cgautomaticshaderexample.java
字号:
//===========================================================================// VITRAL recomendation: Use explicit class imports (not .*) in hello world // type programs so the user/programmer can be exposed to all the complexity // involved. This will help him to dominate the involved libraries.// Java base classesimport java.io.IOException;import java.io.FileInputStream;import java.io.File;// Java GUI classesimport java.awt.event.MouseEvent;import java.awt.event.MouseWheelEvent;import java.awt.event.KeyEvent;import java.awt.event.MouseListener;import java.awt.event.MouseWheelListener;import java.awt.event.MouseMotionListener;import java.awt.event.KeyListener;import javax.swing.JFrame;// JOGL classesimport javax.media.opengl.GL;import javax.media.opengl.GLAutoDrawable;import javax.media.opengl.GLCanvas;import javax.media.opengl.GLEventListener;import com.sun.opengl.util.Animator;// VitralSDK classesimport vsdk.toolkit.common.ColorRgb;import vsdk.toolkit.common.Vector3D;import vsdk.toolkit.common.Matrix4x4;import vsdk.toolkit.common.RendererConfiguration;import vsdk.toolkit.media.IndexedColorImage;import vsdk.toolkit.media.NormalMap;import vsdk.toolkit.media.RGBImage;import vsdk.toolkit.environment.Camera;import vsdk.toolkit.environment.Material;import vsdk.toolkit.environment.Light;import vsdk.toolkit.environment.geometry.Geometry;import vsdk.toolkit.environment.geometry.Sphere;import vsdk.toolkit.io.PersistenceElement;import vsdk.toolkit.io.image.ImagePersistence;import vsdk.toolkit.gui.CameraController;import vsdk.toolkit.gui.CameraControllerAquynza;import vsdk.toolkit.gui.RendererConfigurationController;import vsdk.toolkit.render.jogl.JoglCameraRenderer;import vsdk.toolkit.render.jogl.JoglGeometryRenderer;import vsdk.toolkit.render.jogl.JoglImageRenderer;import vsdk.toolkit.render.jogl.JoglLightRenderer;import vsdk.toolkit.render.jogl.JoglMaterialRenderer;import vsdk.toolkit.render.jogl.JoglMatrixRenderer;import vsdk.toolkit.render.jogl.JoglRenderer;/**This program is an extended variation of the programCgComplexStandardShaderExample with one addition: - Cg shader management is managed by vitral toolkit material / Renderer configuration scheme*/public class CgAutomaticShaderExample implements GLEventListener, MouseListener, MouseMotionListener, MouseWheelListener, KeyListener{ //- GUI ---------------------------------------------------------------- private static GLCanvas canvas; private CameraController cameraController; private RendererConfigurationController qualityController; //- Animation & state control ------------------------------------------ private boolean firstTimer = true; private int needPaint = 3; private boolean withRotationAnimation = false; private boolean withLightAnimation = false; private double lightAngle = 0; //- Scene elements ----------------------------------------------------- private Camera camera; // 1. Camera private Light light; // 2. Light private Material material; // 3. Surface properties private RGBImage textureMap; private NormalMap normalMap; private RGBImage convertedNormalMap = null; private RendererConfiguration quality; private double xrotation; // 4. Geometrical transformations private double yrotation; private double zrotation; private Geometry geometry; // 5. Geometry //---------------------------------------------------------------------- public CgAutomaticShaderExample(boolean appletMode) { if ( !appletMode ) init(); } public void init() { //- Print users' manual ------------------------------------------- System.out.println( "Key controls:\n"+ " - Camera: <cursor arrows>, x/X, y/Y, z/Z, s/S, a/A, f/F, n/N, i\n"+ " - Rendering quality: g, <function keys>\n"+ " - Animation control: <space>, r\n"+ " - Light control: 0, 9, h, k, j, u\n"+ " - Rotation control: 1, 2, 3, 4, 5, 6\n"+ " - Exit: <escape>\n"+ "Mouse controls:\n"+ " - Drag+button1: camera orientation\n"+ " - Drag+button2: camera panning\n"+ " - Drag+button3: camera advance & roll\n" ); System.out.print("Initializing... "); //- Initialize scene elements-------------------------------------- // 1: Camera camera = new Camera(); camera.setPosition(new Vector3D(0, -4, 0)); Matrix4x4 R = new Matrix4x4(); R.eulerAnglesRotation(Math.toRadians(90.0), 0, 0); camera.setRotation(R); camera.setFov(30.0); // 2: Lights light = new Light(Light.POINT, new Vector3D(0, -4, 0), new ColorRgb(1, 1, 1)); // 3.1. Object attribute -> material propierties material = new Material(); material.setAmbient(new ColorRgb(0, 0, 0)); material.setDiffuse(new ColorRgb(1, 1, 1)); material.setSpecular(new ColorRgb(1, 1, 1)); material.setPhongExponent(40); // 3.2. Object attribute -> texture map & bumpmap String imageFilename = null; try { //------------------------------------------------------- imageFilename = "../../../etc/textures/miniearth.png"; textureMap = ImagePersistence.importRGB(new File(imageFilename)); //------------------------------------------------------- normalMap = new NormalMap(); //imageFilename = "../../../etc/bumpmaps/blinn2.bw"; imageFilename = "../../../etc/bumpmaps/earth.bw"; IndexedColorImage source = ImagePersistence.importIndexedColor(new File(imageFilename)); normalMap.importBumpMap(source, new Vector3D(1, 1, 0.2)); convertedNormalMap = normalMap.exportToRgbImage(); normalMap = null; //ImagePersistence.exportPPM(new File("./outputmap.ppm"), convertedNormalMap); } catch (Exception e) { System.err.println("Error: could not read the image file \"" + imageFilename + "\"."); System.err.println("Check you have access to that file from current working directory."); System.err.println(e); System.exit(0); } // 3.3. Object attribute -> how it will render quality = new RendererConfiguration(); quality.setBumpMap(true); // 4. Object attribute -> geometrical transformations xrotation = 0; yrotation = 0; zrotation = 0; // 5. Object attribute -> geometry geometry = new Sphere(1.0); //- Initialize GUI helpers ---------------------------------------- cameraController = new CameraControllerAquynza(camera); qualityController = new RendererConfigurationController(quality); //----------------------------------------------------------------- System.gc(); System.out.println("Ok!"); } public void init(GLAutoDrawable drawable) { // Not used in VitralSDK style applications... check 'firstTimer' } public void display(GLAutoDrawable drawable) { GL gl = drawable.getGL(); if ( withRotationAnimation ) { zrotation += 0.5*2; needPaint = 1; } if ( withLightAnimation ) { Vector3D lightPosition = new Vector3D(1, -3, 1); Vector3D axis = new Vector3D(0, -1, 0); Matrix4x4 R = new Matrix4x4(); lightAngle += Math.toRadians(1.0*2); R.axisRotation(lightAngle, axis); lightPosition = R.multiply(lightPosition); light.setPosition(lightPosition); needPaint = 1; } if ( needPaint <= 0 ) { return; } needPaint--; if ( firstTimer ) { firstTimer = false; // IMPORTANT POINT 1/4 JoglRenderer.createDefaultAutomaticNvidiaCgShaders(); } //----------------------------------------------------------------- gl.glEnable(GL.GL_DEPTH_TEST); gl.glClearColor(0, 0, 0, 1.0f); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -