Advertisement
Guest User

Untitled

a guest
May 17th, 2013
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.31 KB | None | 0 0
  1. import static org.lwjgl.opengl.GL11.*;
  2. import static org.lwjgl.opengl.GL20.*;
  3. import static org.lwjgl.opengl.GL30.*;
  4.  
  5. import java.nio.ByteBuffer;
  6. import java.nio.IntBuffer;
  7.  
  8. import org.lwjgl.BufferUtils;
  9. import org.lwjgl.LWJGLException;
  10. import org.lwjgl.input.Keyboard;
  11. import org.lwjgl.opengl.*;
  12.  
  13. public class DistortionCorrection {
  14.    
  15.     public enum Eye {
  16.         Left, Right
  17.     };
  18.    
  19.     protected int shader=0;
  20.     protected int vertShader=0;
  21.     protected int fragShader=0;
  22.    
  23.     protected int colorTextureID;
  24.     protected int framebufferID;
  25.     protected int depthRenderBufferID;
  26.    
  27.     private int LensCenterLocation;
  28.     private int ScreenCenterLocation;
  29.     private int ScaleLocation;
  30.     private int ScaleInLocation;
  31.     private int HmdWarpParamLocation;
  32.  
  33.     private final static String VERTEX_SHADER_SOURCE =
  34.             "void main() {\n" +
  35.             "   gl_TexCoord[0] = gl_MultiTexCoord0;\n" +
  36.             "   gl_Position = gl_Vertex;\n" +
  37.             "}";
  38.    
  39.     private final static String FRAGMENT_SHADER_SOURCE =
  40.             "uniform sampler2D tex;\n" +
  41.             "uniform vec2 LensCenter;\n" +
  42.             "uniform vec2 ScreenCenter;\n" +
  43.             "uniform vec2 Scale;\n" +
  44.             "uniform vec2 ScaleIn;\n" +
  45.             "uniform vec4 HmdWarpParam;\n" +
  46.             "\n" +
  47.             "vec2 HmdWarp(vec2 texIn)\n" +
  48.             "{\n" +
  49.             "   vec2 theta = (texIn - LensCenter) * ScaleIn;\n" +
  50.             "   float  rSq= theta.x * theta.x + theta.y * theta.y;\n" +
  51.             "   vec2 theta1 = theta * (HmdWarpParam.x + HmdWarpParam.y * rSq + " +
  52.             "           HmdWarpParam.z * rSq * rSq + HmdWarpParam.w * rSq * rSq * rSq);\n" +
  53.             "   return LensCenter + Scale * theta1;\n" +
  54.             "}\n" +
  55.             "\n" +
  56.             "\n" +
  57.             "\n" +
  58.             "void main()\n" +
  59.             "{\n" +
  60.             "   vec2 tc = HmdWarp(gl_TexCoord[0]);\n" +
  61.             "   if (any(notEqual(clamp(tc, ScreenCenter-vec2(0.25,0.5), ScreenCenter+vec2(0.25, 0.5)) - tc, vec2(0.0, 0.0))))\n" +
  62.             "       gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n" +
  63.             "   else\n" +
  64.             "       gl_FragColor = texture2D(tex, tc);\n" +
  65.             "}";
  66.  
  67.     public DistortionCorrection(int screenWidth, int screenHeight) {
  68.         initShaders(VERTEX_SHADER_SOURCE, FRAGMENT_SHADER_SOURCE);
  69.         initFBO(screenWidth, screenHeight);
  70.         Util.checkGLError();
  71.        
  72.         LensCenterLocation = glGetUniformLocation(shader, "LensCenter");
  73.         ScreenCenterLocation = glGetUniformLocation(shader, "ScreenCenter");
  74.         ScaleLocation = glGetUniformLocation(shader, "Scale");
  75.         ScaleInLocation = glGetUniformLocation(shader, "ScaleIn");
  76.         HmdWarpParamLocation = glGetUniformLocation(shader, "HmdWarpParam");
  77.         System.out.println(FRAGMENT_SHADER_SOURCE);
  78.         Util.checkGLError();
  79.     }
  80.  
  81.     private void initFBO(int screenWidth, int screenHeight) {
  82.         framebufferID = glGenFramebuffers();                                                                                
  83.         colorTextureID = glGenTextures();                                                                                              
  84.         depthRenderBufferID = glGenRenderbuffers();                                                                  
  85.  
  86.         glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);                                              
  87.  
  88.         // initialize color texture
  89.         glBindTexture(GL_TEXTURE_2D, colorTextureID);                                                                  
  90.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);                              
  91.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, screenWidth, screenHeight, 0,GL_RGBA, GL_INT, (java.nio.ByteBuffer) null);
  92.         //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  93.         //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  94.  
  95.         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D, colorTextureID, 0);
  96.  
  97.         // initialize depth renderbuffer
  98.         glBindRenderbuffer(GL_RENDERBUFFER, depthRenderBufferID);                              
  99.         glRenderbufferStorage(GL_RENDERBUFFER, GL14.GL_DEPTH_COMPONENT24, screenWidth, screenHeight);
  100.         glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER, depthRenderBufferID);
  101.  
  102.         glBindFramebuffer(GL_FRAMEBUFFER, 0);                                                                    
  103.     }
  104.  
  105.     public void beginOffScreenRenderPass() {
  106.        
  107.         glBindTexture(GL_TEXTURE_2D, 0);        
  108.         Util.checkGLError();
  109.         glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
  110.         Util.checkGLError();
  111.     }
  112.    
  113.     public void endOffScreenRenderPass() {
  114.        
  115.     }
  116.    
  117.     public void renderToScreen() {
  118.         Util.checkGLError();
  119.         glUseProgram(shader);
  120.         Util.checkGLError();
  121.  
  122.        
  123.         glEnable(GL_TEXTURE_2D);    
  124.         glDisable(GL_DEPTH_TEST);
  125.         glBindFramebuffer(GL_FRAMEBUFFER, 0);                                    
  126.  
  127.         glClearColor (1.0f, 0.0f, 0.0f, 0.5f);
  128.         glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  129.  
  130.         glBindTexture(GL_TEXTURE_2D, colorTextureID);  
  131.  
  132.         renderDistortedEye(Eye.Left, 0.0f, 0.0f, 0.5f, 1.0f);
  133.         renderDistortedEye(Eye.Right, 0.5f, 0.0f, 0.5f, 1.0f);
  134.  
  135.         glUseProgram(0);
  136.         glEnable(GL_DEPTH_TEST);
  137.  
  138.     }
  139.    
  140.     public static float K0 = 1.0f;
  141.     public static float K1 = 0.22f;
  142.     public static float K2 = 0.24f;
  143.     public static float K3 = 0.0f;
  144.    
  145.     public void renderDistortedEye(Eye eye, float x, float y, float w, float h) {
  146.         float as = w/h;
  147.        
  148.         float scaleFactor = 1.0f;
  149.        
  150.         this.validate();
  151.         Util.checkGLError();
  152.        
  153.         float DistortionXCenterOffset;
  154.         if (eye == Eye.Left) {
  155.             DistortionXCenterOffset = 0.25f;
  156.         }
  157.         else {
  158.             DistortionXCenterOffset = -0.25f;
  159.         }
  160.        
  161.         glUniform2f(LensCenterLocation, x + (w + DistortionXCenterOffset * 0.5f)*0.5f, y + h*0.5f);
  162.         glUniform2f(ScreenCenterLocation, x + w*0.5f, y + h*0.5f);
  163.         glUniform2f(ScaleLocation, (w/2.0f) * scaleFactor, (h/2.0f) * scaleFactor * as);;
  164.         glUniform2f(ScaleInLocation, (2.0f/w), (2.0f/h) / as);
  165.  
  166.         glUniform4f(HmdWarpParamLocation, K0, K1, K2, K3);
  167.        
  168.         if (eye == Eye.Left) {
  169.             glBegin(GL_TRIANGLE_STRIP);
  170.                 glTexCoord2f(0.0f, 0.0f);   glVertex2f(-1.0f, -1.0f);
  171.                 glTexCoord2f(0.5f, 0.0f);   glVertex2f(0.0f, -1.0f);
  172.                 glTexCoord2f(0.0f, 1.0f);   glVertex2f(-1.0f, 1.0f);
  173.                 glTexCoord2f(0.5f, 1.0f);   glVertex2f(0.0f, 1.0f);
  174.             glEnd();
  175.         }
  176.         else {
  177.             glBegin(GL_TRIANGLE_STRIP);
  178.                 glTexCoord2f(0.5f, 0.0f);   glVertex2f(0.0f, -1.0f);
  179.                 glTexCoord2f(1.0f, 0.0f);   glVertex2f(1.0f, -1.0f);
  180.                 glTexCoord2f(0.5f, 1.0f);   glVertex2f(0.0f, 1.0f);
  181.                 glTexCoord2f(1.0f, 1.0f);   glVertex2f(1.0f, 1.0f);
  182.             glEnd();            
  183.         }
  184.     }
  185.    
  186.     protected void initShaders(String vertexShader, String fragmentShader) {
  187.         shader=glCreateProgram();
  188.  
  189.         vertShader=createVertShader(vertexShader);
  190.         fragShader=createFragShader(fragmentShader);
  191.         Util.checkGLError();
  192.  
  193.         if (vertShader != 0 && fragShader != 0) {
  194.             glAttachShader(shader, vertShader);
  195.             glAttachShader(shader, fragShader);
  196.  
  197.             glLinkProgram(shader);
  198.             if (glGetProgram(shader, GL_LINK_STATUS) == GL_FALSE) {
  199.                 System.out.println("Linkage error");
  200.                 printLogInfo(shader);
  201.                 System.exit(0);
  202.             }
  203.  
  204.             glValidateProgram(shader);
  205.             if (glGetProgram(shader, GL_VALIDATE_STATUS) == GL_FALSE) {
  206.                 printLogInfo(shader);
  207.                 System.exit(0);
  208.             }
  209.         } else {
  210.             System.out.println("No shaders");
  211.             System.exit(0);
  212.         }
  213.         Util.checkGLError();
  214.     }
  215.  
  216.     public void validate() {
  217.         glValidateProgram(shader);
  218.         if (glGetProgram(shader, GL_VALIDATE_STATUS) == GL_FALSE) {
  219.             printLogInfo(shader);
  220.         }
  221.     }
  222.  
  223.     private int createVertShader(String vertexCode){
  224.         vertShader=glCreateShader(GL_VERTEX_SHADER);
  225.  
  226.         if (vertShader==0) {
  227.             return 0;
  228.         }
  229.  
  230.         glShaderSource(vertShader, vertexCode);
  231.         glCompileShader(vertShader);
  232.  
  233.         if (glGetShader(vertShader, GL_COMPILE_STATUS) == GL_FALSE) {
  234.             printLogInfo(vertShader);
  235.             vertShader=0;
  236.         }
  237.         return vertShader;
  238.     }
  239.  
  240.     private int createFragShader(String fragCode){
  241.  
  242.         fragShader = glCreateShader(GL_FRAGMENT_SHADER);
  243.         if (fragShader==0) {
  244.             return 0;
  245.         }
  246.         glShaderSource(fragShader, fragCode);
  247.         glCompileShader(fragShader);
  248.         if (glGetShader(fragShader, GL_COMPILE_STATUS) == GL_FALSE) {
  249.             printLogInfo(fragShader);
  250.             fragShader=0;
  251.         }
  252.         return fragShader;
  253.     }
  254.  
  255.     protected static boolean printLogInfo(int obj){
  256.         IntBuffer iVal = BufferUtils.createIntBuffer(1);
  257.         glGetShader(obj,GL_INFO_LOG_LENGTH, iVal);
  258.  
  259.         int length = iVal.get();
  260.         if (length > 1) {
  261.             ByteBuffer infoLog = BufferUtils.createByteBuffer(length);
  262.             iVal.flip();
  263.             glGetShaderInfoLog(obj, iVal, infoLog);
  264.             byte[] infoBytes = new byte[length];
  265.             infoLog.get(infoBytes);
  266.             String out = new String(infoBytes);
  267.             System.out.println("Info log:\n"+out);
  268.             return false;
  269.         }
  270.         else {
  271.             return true;
  272.         }
  273.     }
  274.    
  275.     public static void main(String[] args) {
  276.         try {
  277.             DisplayMode displayMode = new DisplayMode(640, 400);
  278.             Display.setDisplayMode(displayMode);
  279.             Display.setTitle("Barrel Distorion Shader");
  280.             //Display.setLocation(-1000, 200);
  281.             PixelFormat pixelFormat = new PixelFormat(8, 8, 8);
  282.             Display.create(pixelFormat);
  283.         } catch (LWJGLException e) {
  284.                 e.printStackTrace();
  285.         }
  286.        
  287.         DistortionCorrection shader = new DistortionCorrection(640, 400);
  288.        
  289.         while (!Display.isCloseRequested()) {
  290.             if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
  291.                 System.exit(0);
  292.             }
  293.             shader.beginOffScreenRenderPass();
  294.            
  295.             glDisable(GL_DEPTH_TEST);
  296.             glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  297.             glClear(GL_COLOR_BUFFER_BIT);
  298.            
  299.             glMatrixMode(GL_PROJECTION);
  300.             glLoadIdentity();
  301.             glMatrixMode(GL_MODELVIEW);
  302.             glLoadIdentity();
  303.            
  304.            
  305.             glBegin(GL_LINES);
  306.                 glColor3f(1.0f, 0.0f, 0.0f);
  307.                 for (int i=0; i<20; i++) {
  308.                     glVertex2f(-1.0f, -1.0f + 0.1f * i);
  309.                     glVertex2f(1.0f, -1.0f + 0.1f * i);
  310.                 }
  311.                 for (int i=0; i<20; i++) {
  312.                     glVertex2f(-1.0f + 0.1f * i, -1.0f);
  313.                     glVertex2f(-1.0f + 0.1f * i, 1.0f);
  314.                 }
  315.             glEnd();
  316.    
  317.             shader.endOffScreenRenderPass();
  318.             shader.renderToScreen();
  319.          
  320.             Display.sync(60);
  321.             Display.update();
  322.         }
  323.     }
  324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement