BufferedImage img = ImageIO.read(is);
byte[] obuffer = ((DataBufferByte) (img.getRaster().getDataBuffer())).getData();
for(int i=0;i<obuffer.length;i+=4) {
//ARGB to RGBA
byte tempA= obuffer;
obuffer = obuffer[i+1];
obuffer[i+1] = obuffer[i+2];
obuffer[i+2] = obuffer[i+3];
obuffer[i+3] = tempA;
}
내가 로드하는 건 png 파일이다.
ByteBuffer buffer = ByteBuffer.allocate(obuffer.length);
buffer.put(obuffer);
buffer.position(0);
IntBuffer intbf = IntBuffer.allocate(4);
gl.glGenTextures(1, intbf);
int cha = intbf.get();
gl.glBindTexture(gl.GL_TEXTURE_2D,cha);
그러면 cha 라는 공간에 최종적으로 ID가 할당된다. 이 ID로 텍스처 바인딩을 해주고, 바인딩된 텍스처에 할당할 텍스처 정보와 버퍼를 기입한다.
gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_RGBA, img.getWidth(),img.getHeight(), 0, GL2.GL_RGBA, GL2.GL_UNSIGNED_BYTE, buffer);
아까, ARGB 채널에서 RGBA 채널로 변환하엿으므로 GL2.GL_RGBA 로 변환한다.
한편, BufferedImage 로 로드한 이미지의 width와 height를 가져와 기입한다. 이미지의 width 정보와 height 정보는 명확해야한다. 이미지 버퍼 데이터를 1차원으로 펴놓은 상태이기 때문에, 이미지 너비 높이 정보가 확실해야 문제 없이 불러올 수 있다. 1이라도 차이나는 경우 이미지가 깨질 수 있다.
렌더링
이 텍스처 정보를 이제 Vertex를 출력할때 같이 TexCoord를 할당해서 출력할 수 있다.
기본적으로 쉐이더 없이 텍스처를 출력할 것이기 때문에 텍스처 좌표 맵핑 방법을 정의한다. GL_TEXTURE_WRAP_S는 수평방향의 작업 정책, GL_TEXTURE_WRAP_T는 수직 방향의 작업 정책을 의미하고, GL_TEXTURE_MIN_FILTER은 축소시 정책, GL_TEXTURE_MAG_FILTER은 확대시 정책을 나타내는데, 벗어난 텍스처 좌표는 반복되도록 하기 위해서 GL_REPEAT로 지정하고, 축, 확대시 부드러운 표시를 위해 선형 보간 모드인 GL_LINEAR로 지정하였다.
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_REPEAT);
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_REPEAT);
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR);
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR);
그리고 Texture 2D 에 특정 텍스처를 바인딩하고 TexCoord와 함께 그려준다.
gl.glEnable(GL2.GL_TEXTURE_2D);
gl.glBindTexture(GL2.GL_TEXTURE_2D, textureID);
gl.glBegin(GL2.GL_QUADS);
gl.glTexCoord2f(0.0f, 0.0f);gl.glVertex2f(-0.5f, 0.5f);//좌상단
gl.glTexCoord2f(3.5f, 0.0f); gl.glVertex2f(0.5f, 0.5f);//우상단
gl.glTexCoord2f(3.5f, 1.0f); gl.glVertex2f(0.5f, -0.5f); //우하단
gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex2f(-0.5f, -0.5f); //좌하단
gl.glEnd();
gl.glDisable(GL2.GL_TEXTURE_2D);