2012-06-23 5 views
0

저는 자바 일반 그래픽 장치, awt 및 스윙 물건을 그래픽, Graphics2D 등으로 사용하고 잠시 후 LWJGL에 대한 일련의 자습서를 보았습니다. 나는 그 시스템에서 나의 게임 중 하나를 정말로 즐겁게하고 다시하기로 결정했다; 나는 이미 논리가 있었기 때문에 쉽게 될 것이라고 생각했다. 그리고 나는 단지 하나의 개념적 문제에 부딪쳤다.LWJGL을 사용하여 이미지를 메모리에 저장하는 방법은 무엇입니까?

이 특별한 경우에는 상자를 나타내는 클래스 상자가 있었지만 이미지로 그려 테두리를 만들었습니다. 나는 9 개의 이미지를 가지고 있는데 하나는 중앙 (하나의 보통 컬러 1 픽셀 너비 이미지), 4 개는 측면, 4 개는 모서리입니다. 이 이미지는 모두 BufferedImage 배열에 포함되어있었습니다. 정적 인 이미지는 모든 상자에서 동일했기 때문입니다. 그런 다음, 각 상자에는 상자를 그린 전역 BufferedImage가 있습니다. 이는 상자의 모든 부분에 이미지를 그려야하기 때문에 느린 과정입니다. 그런 다음, 실제 그리기 방법 (Graphics g을 수신)에서 BufferedImage를 올바른 위치에 그렸습니다. 일단 상자가 생성되면 상자의 크기가 변경되지 않았으므로 상자의 이미지를 생성자에서 한 번만 '생성'해야했습니다.

glW 메서드 (glBegin(), glVertex2i())가 화면에 항상 그려지기 때문에, LWJGL을 사용하여이를 수행하는 방법을 파악할 수 없었습니다. 그렇다면 어떻게 이미지에 그림을 그릴 수 있으며 (BufferedImage를 사용하여) 이미지를 메모리에 저장하는 방법과 필요할 때 화면에 어떻게 그릴 수 있습니까? 나는 LWJGL이 텍스처를 사용한다는 것을 알았고, BufferedImage의 첫 번째 정적 배열을 텍스처의 정적 배열로 만든 다음, 그 안에 9 개의 텍스처 각각을 올바르게 저장했습니다. 올바른 방법인가요? 글로벌 BufferedImage는 글로벌 Texture일까요? 이 경우 텍스처에 '그리는'방법은 무엇입니까?

답변

1

찾고있는 기술은 일반적으로 'Render to Texture'(RTT)라고합니다. OpenGL 프레임 버퍼를 만들고, 텍스처를 첨부하고, 프레임 버퍼를 바인드 한 다음 일반 그리기 호출을 실행합니다. 프레임 버퍼가 바운드 된 상태에서 그리기 호출이 텍스처에 직접 그려집니다. 그런 다음 프레임 버퍼를 바인딩 해제하고 텍스처를 일반 텍스처로 사용합니다.

이러한 검색어를 사용하면 정확하게 인터넷에서 자습서를 찾을 수 있습니다.

내가 궁금한 점은 상자가 일반 질감으로 그려 질 수없는 것처럼 보이는 것일까 요? 어쩌면 더 쉬운 방법이있을 것입니다.

+0

대단히 감사합니다. 지금 당장 검색 중이므로 매우 유용 할 것입니다. 상자에 관해서는 텍스처가 어떻게 작동하는지 정확히 알지 못하지만, 이렇게하는 것입니다. 만드는 상자 하나마다 크기가 다르며 모두 고정 된 크기의 테두리가 있습니다. 그래서 나는 더 나은 방법은 9 개의 이미지를 만드는 것이라고 생각했습니다. 더 좋은 방법이 있는지 나는 모른다. 정적 텍스쳐로 경계가 상자와 함께 커지게 될 것이라고 상상했다. 나는 그것을 원하지 않는다. –

1

LWJGL texture tutorial을 위키에서 살펴보십시오. 이 예제에서는 Slick-Util Library을 사용하므로 이미지에서 텍스처를 훨씬 쉽게 만들 수 있습니다.


또는 사용자가 직접 텍스처를 생성 할 수 있습니다

BufferedImage bufferedImage = ...; 
ByteBuffer textureBuffer = convertImageData(bufferedImage); 

int texture = glGenTextures(); 
glBindTexture(GL_TEXTURE_2D, texture); 

int pixelFormat; 
if (bufferedImage.getColorModel().hasAlpha()) { 
    pixelFormat = GL_RGBA; 
} else { 
    pixelFormat = GL_RGB; 
} 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
     bufferedImage.getWidth(), bufferedImage.getHeight(), 0, 
     pixelFormat, GL_UNSIGNED_BYTE, textureBuffer); 

Aaaaaand이 convertImageData에 대한 this answer()를 참조 나는 전에 서면으로 작성했습니다. (코드에는 제거 할 수있는 몇 줄이 있습니다)

텍스처를 그리려면 : LWJGL Space Invaders의 97 행을보십시오.

+0

내 편집 된 답변을 참조하십시오. * 작동해야합니다. :) –

+0

나는 tryed, 그리고 어떤 오류를주지는 않지만 아직 작동하지 않습니다. 그것은 BufferedImage를 생성합니다. OK (그냥 보려는 파일에 저장했습니다). 사각형은 엉망인 텍스처로 나타납니다. 나는 오류를 찾으려고 노력하고있다. 분명히 내가 코드의 다른 부분에서했던 실수 다. 귀하의 답변 주셔서 감사합니다! –

1

OpenGL에서 크기 조정은 저렴합니다. 사전 생성 할 필요가 없습니다. 모든 이미지를 하나의 텍스처에 넣고 텍스처 매핑을 사용하여 이미지를 화면에 그릴 때 제대로 배치하고 크기를 조정할 수 있습니다.

BufferedImage을 사용하는 솔루션을 이미 사용하고 있다면 그렇게하십시오. GPU에서이 이미지를 생성해도 시간이 많이 절약되지는 않습니다. awt를 사용하여 이미지를 생성하고 텍스쳐를 생성 한 다음 LWJGL을 사용하여 화면에 그립니다.

정말하고 싶다면 glCopyPixels을 사용하여 화면에서 텍스처로 저장할 수 있습니다. 하지만 OpenGL을 배우기 시작하지는 않을 것입니다. 이미지를 주 메모리로 전송하지 마십시오 (BufferedImage가 아닌 텍스쳐에 유지). CPU와 GPU 사이의 데이터 전송 속도가 매우 느립니다.

+0

텍스쳐 매핑을 찾았는데 내가 원하는 것을 할 수있는 방법을 찾지 못했습니다. (훌륭한 튜토리얼도 찾지 못했습니다. BufferedImage에서 텍스처를 생성하려고 시도했지만 작동하지 않았습니다. BI가 올바르게 생성되었으며 인터넷에서 복사 한 방법을 사용했지만 흰색 상자가 표시됩니다. 텍스쳐 매핑을 사용하려고했는데, 또 다른 sugestion을 받았다.하지만 아무 것도하지 않았다. –

관련 문제