2013-01-03 4 views
0

나는 fbo 's를 통해 두 장의 이미지를 캡처하고 있습니다. 그런 다음이 이미지를 재사용하여 fbo 및 쉐이더를 사용하여 이미지를 추가합니다. 이제 어떤 이유로 이미지가 회전되어 어디서 발생했는지 모릅니다.Fbo 텍스처가 뒤집기/회전 됨

아래 코드 중 일부는 연결할 수 있습니다. 요청시 더 많은 코드를 제공 할 수 있습니다.

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
      int bpp = 4; // Assuming a 32-bit display with a byte each for red, green, blue, and alpha. 
      ByteBuffer buffer = BufferUtils.createByteBuffer(SAVE_WIDTH * SAVE_HEIGHT * bpp); 
      glReadPixels(0, 0, SAVE_WIDTH, SAVE_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 

      File file = new File("picture" + k + ".png"); // The file to save to. 
      String format = "png"; // Example: "PNG" or "JPG" 
      BufferedImage image = new BufferedImage(SAVE_WIDTH, SAVE_HEIGHT, BufferedImage.TYPE_INT_ARGB); 

      for(int x = 0; x < SAVE_WIDTH; x++) 
       for(int y = 0; y < SAVE_HEIGHT; y++) 
       { 
         int i = (x + (SAVE_WIDTH * y)) * bpp; 
         int r = buffer.get(i) & 0xFF; 
         int g = buffer.get(i + 1) & 0xFF; 
         int b = buffer.get(i + 2) & 0xFF; 
         int a = buffer.get(i + 3) & 0xFF; 
         image.setRGB(x, SAVE_HEIGHT - (y + 1), (a << 24) | (r << 16) | (g << 8) | b); 
       } 


      try { 
       ImageIO.write(image, format, file); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

을 그리고 나는이처럼로드 :

나는이 같은 이미지를 저장

ByteBuffer buf = null; 
     File file = new File(filename); 

     if (file.exists()) { 

      try { 
       BufferedImage image = ImageIO.read(file); 

       buf = Util.getImageDataFromImage(image); 
      } catch (IOException ex) { 
       Logger.getLogger(SkyBox.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } else { 
      int length = SAVE_WIDTH * SAVE_HEIGHT * 4; 
      buf = ByteBuffer.allocateDirect(length); 
      for (int i = 0; i < length; i++) 
       buf.put((byte)0xFF); 
      buf.rewind(); 
     } 

     // Create a new texture object in memory and bind it 
     glBindTexture(GL_TEXTURE_2D, pictureTextureId); 

     // All RGB bytes are aligned to each other and each component is 1 byte 
     glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

     // Upload the texture data and generate mip maps (for scaling) 
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SAVE_WIDTH, SAVE_HEIGHT, 0, 
         GL_RGBA, GL_UNSIGNED_BYTE, buf);  

     // Setup what to do when the texture has to be scaled 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
         GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
         GL_NEAREST); 

getImageDataFromImage()를

WritableRaster wr = bufferedImage.getRaster(); 
    DataBuffer db = wr.getDataBuffer(); 
    DataBufferByte dbb = (DataBufferByte) db; 
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(dbb.getData().length); 

    byte[] bytes = dbb.getData(); 

    for(int i=0; i<bytes.length; i+=4) { 
     byteBuffer.put(bytes[i+3]); 
     byteBuffer.put(bytes[i+2]); 
     byteBuffer.put(bytes[i+1]); 
     byteBuffer.put(bytes[i]); 
    } 

    byteBuffer.flip(); 
    return byteBuffer; 

답변

1

회전하거나 수직으로 이성을 상실? 뒤집 으면 OpenGL과 이미지 파일 형식이 좌표계의 원점에서 반드시 일치하지 않기 때문입니다. OpenGL과 일반적인 투영 설정의 경우 원점은 왼쪽 아래에 있습니다. 대부분의 이미지 파일 형식과 IO 라이브러리는 왼쪽 상단에 원본을 가정합니다.

관련 문제