맨위로가기

자바 OpenGL

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

자바 OpenGL(JOGL)은 자바 네이티브 인터페이스(JNI) 호출을 통해 OpenGL C API와 윈도우 API에 접근하는 라이브러리이다. JOGL은 OpenGL 기능을 객체 지향 방식이 아닌 절차적 OpenGL API를 노출하는 방식으로 설계되었으며, GlueGen 도구를 통해 OpenGL C 헤더 파일에서 코드를 자동 생성한다. OpenGL 4.5 사양과 다양한 벤더 확장을 지원하며, Java SE 6부터 Java2D와의 상호 운용이 가능하다. JOGL은 데스크톱 및 모바일 환경에서 OpenGL 및 OpenGL ES 버전을 지원하며, Vulkan API 지원도 계획하고 있다.

더 읽어볼만한 페이지

  • OpenGL - WebGL
    WebGL은 웹 브라우저에서 3차원 그래픽을 렌더링하기 위한 API이며, OpenGL ES를 기반으로 개발되어 다양한 웹 브라우저와 모바일 환경에서 지원된다.
  • OpenGL - OpenGL ES
    OpenGL ES는 임베디드 시스템 및 모바일 장치를 위한 3D 그래픽 API로, OpenGL의 부분 집합이며, 다양한 버전으로 발전해 왔고, 안드로이드, iOS 등 여러 플랫폼에서 3D 그래픽 구현에 사용되며 WebGL의 기반이 되기도 한다.
  • 자바 API - 자바 암호화 확장
  • 자바 API - 표준 위젯 툴킷
    표준 위젯 툴킷(SWT)은 자바 GUI 툴킷으로, 네이티브 룩앤필과 고성능을 위해 윈도 시스템의 그래픽 요소를 직접 사용하며, 이클립스 IDE의 기반 기술로 IBM에 의해 개발되었다.
  • 자바 라이브러리 - 아파치 루씬
    아파치 루씬은 더그 커팅이 개발한 오픈 소스 전문 검색 라이브러리이며, 텍스트 색인 및 검색 기능을 제공하여 웹 검색 엔진, 퍼지 검색, 추천 시스템 구현 등에 사용된다.
  • 자바 라이브러리 - 구글 구아바
    구글 구아바는 구글에서 개발한 오픈 소스 자바 라이브러리로, 자바 컬렉션 프레임워크 확장, 캐싱, I/O, 문자열 처리 등 다양한 유틸리티 기능 제공, 함수형 프로그래밍 스타일 컬렉션 적용을 통해 자바 개발 생산성 향상에 기여한다.
자바 OpenGL - [IT 관련 정보]에 관한 문서
JOGL 정보
일반 정보
JOGL 굴절 데모 스크린샷
macOS에서 JOGL을 사용하여 실시간 굴절을 렌더링하고 있는 데모 프로그램
개발자http://jogamp.org/
최신 릴리스 버전2.5.0
최신 릴리스 날짜2023년 8월 18일
프로그래밍 언어Java, C 언어
운영체제크로스 플랫폼, Solaris, Linux, Microsoft Windows, macOS, Android
장르3차원 컴퓨터 그래픽스 소프트웨어 (라이브러리/API)
라이선스BSD 라이선스
웹사이트http://jogamp.org

2. 디자인

JOGL은 OpenGL C API와 윈도우 API를 자바 네이티브 인터페이스 (JNI) 호출을 통해 접근한다.[3] 따라서 JOGL이 작동하려면 기본 시스템이 OpenGL을 지원해야 한다.

JOGL은 객체 지향 프로그래밍 방식이 아닌, 몇몇 클래스의 메서드를 통해 절차적 OpenGL API를 노출하는 방식으로 설계되었다. JOGL 코드의 대부분은 ''GlueGen''이라는 변환 도구를 통해 OpenGL C 헤더 파일에서 자동 생성된다.

3. 개발 현황

JOGL은 OpenGL 4.5 사양과 거의 모든 벤더 확장(OpenCL, OpenMAX, OpenAL 포함)을 지원한다.[4] JOGL '''2.5.0''' 버전은 JSR-231 (자바 OpenGL 바인딩)의 참조 구현이다.[5] '''1.1.1''' 릴리스는 GLU NURBS에 대한 제한적인 접근을 제공하여 곡선과 표면을 렌더링할 수 있었다. '''2.3.2''' 릴리스에서는 OpenGL 버전 4.5, OpenGL ES 버전 3.2까지 지원이 추가되었다.

웨이랜드(Wayland)와 벌칸(Vulkan) 지원이 계획되어 있다.[6] 2015년 8월 현재 JOGL은 데스크톱용 OpenGL 버전 1.0 - 4.5, 모바일용 ES 버전 1.0 - 3.1, EGL 버전 1.0 - 1.5를 지원하며, 거의 모든 기능 확장을 사용할 수 있다.

JOGL 버전 2.4.0에서는 OpenGL의 후속 API인 Vulkan을 지원할 예정이다.

4. Java2D-OpenGL 상호 운용성

자바 SE 6 버전의 자바부터, Java2D(자바에서 2차원 그래픽을 그리는 API)와 JOGL은 상호 운용이 가능해져 다음과 같은 기능을 제공한다.[7]


  • Swing 컴포넌트(경량 메뉴, 툴팁, 기타 위젯)를 OpenGL 렌더링 위에 겹쳐서 표시한다.
  • Java2D 렌더링 위에 3D OpenGL 그래픽을 그린다.
  • 일반적으로 Swing 위젯이 사용되는 모든 곳에서 3D 그래픽을 사용할 수 있다.(JTable, JTree 내부 등)
  • 3D OpenGL 렌더링 위에 Java2D 그래픽을 그린다.

5. 코드 예제

JOGL을 사용한 코드 예제를 살펴본다. 아래는 OpenGL 렌더링을 수행하는 코드이다.



@Override

public void display(GLAutoDrawable drawable) {

GL4 gl4 = drawable.getGL().getGL4();

gl4.glClearBufferfv(GL2ES3.GL_COLOR, 0, clearColor);

gl4.glClearBufferfv(GL2ES3.GL_DEPTH, 0, clearDepth);

{

FloatUtil.makeLookAt(view, 0, eye, 0, at, 0, up, 0, tmp);

FloatUtil.makePerspective(projection, 0, reset, 45f, aspect, near, far);

FloatUtil.multMatrix(projection, view); // projection *= view

transformPointer.asFloatBuffer().put(projection);

}

gl4.glUseProgram(programName);

gl4.glBindVertexArray(vertexArrayName.get(0));

gl4.glBindBufferBase(GL2ES3.GL_UNIFORM_BUFFER /*target*/, 1 /*TRANSFORM0, index*/, bufferName.get(2) /*TRANSFORM, buffer*/);

gl4.glBindTextureUnit(0 /*diffuse*/, textureName.get(0));

gl4.glBindSampler(0 /*diffuse*/, samplerName.get(0));

gl4.glDrawElements(GL.GL_TRIANGLES, elementCount, GL.GL_UNSIGNED_SHORT, 0);

}



`display` 메서드는 `GLAutoDrawable` 객체를 인자로 받아 렌더링을 수행하며, 주요 단계는 다음과 같다.


  • GL4 객체: `drawable.getGL().getGL4()`를 통해 `GL4` 객체를 얻는다.
  • 버퍼 초기화: 색상 버퍼와 깊이 버퍼를 초기화한다.
  • 행렬 설정: 뷰 행렬(카메라)과 투영 행렬을 설정하고 곱한다.
  • 셰이더 프로그램 사용: 렌더링에 사용할 셰이더 프로그램을 지정한다.
  • VAO/UBO 바인딩: 정점 데이터(VAO) 및 균일 변수 데이터(UBO)를 바인딩한다.
  • 텍스처/샘플러 바인딩: 텍스처와 샘플러를 바인딩한다.
  • 렌더링: `glDrawElements` 함수로 삼각형을 그린다.

5. 1. OpenGL 렌더링 예제

java

@Override

public void display(GLAutoDrawable drawable) {

GL4 gl4 = drawable.getGL().getGL4();

gl4.glClearBufferfv(GL2ES3.GL_COLOR, 0, clearColor);

gl4.glClearBufferfv(GL2ES3.GL_DEPTH, 0, clearDepth);

{

FloatUtil.makeLookAt(view, 0, eye, 0, at, 0, up, 0, tmp);

FloatUtil.makePerspective(projection, 0, reset, 45f, aspect, near, far);

FloatUtil.multMatrix(projection, view); // projection *= view

transformPointer.asFloatBuffer().put(projection);

}

gl4.glUseProgram(programName);

gl4.glBindVertexArray(vertexArrayName.get(0));

gl4.glBindBufferBase(GL2ES3.GL_UNIFORM_BUFFER /*target*/, 1 /*TRANSFORM0, index*/, bufferName.get(2) /*TRANSFORM, buffer*/);

gl4.glBindTextureUnit(0 /*diffuse*/, textureName.get(0));

gl4.glBindSampler(0 /*diffuse*/, samplerName.get(0));

gl4.glDrawElements(GL.GL_TRIANGLES, elementCount, GL.GL_UNSIGNED_SHORT, 0);

}

```

이 코드는 JOGL (Java OpenGL)을 사용하여 OpenGL 렌더링을 수행하는 예제이다. `display` 메서드는 `GLAutoDrawable` 객체를 인자로 받아 렌더링을 수행한다.

주요 단계는 다음과 같다:

1. GL4 객체 얻기: `drawable.getGL().getGL4()`를 통해 OpenGL 4.x 컨텍스트를 나타내는 `GL4` 객체를 얻는다.

2. 버퍼 초기화: `glClearBufferfv` 함수를 사용하여 색상 버퍼와 깊이 버퍼를 초기화한다. `clearColor`와 `clearDepth`는 각각 버퍼를 지울 때 사용할 색상과 깊이 값을 나타낸다.

3. 뷰 및 투영 행렬 설정:

  • `FloatUtil.makeLookAt` 함수를 사용하여 뷰 행렬(view matrix)을 생성한다. 뷰 행렬은 카메라의 위치와 방향을 정의한다.
  • `FloatUtil.makePerspective` 함수를 사용하여 투영 행렬(projection matrix)을 생성한다. 투영 행렬은 원근 투영(perspective projection)을 정의하며, 시야각, 종횡비, 근거리 및 원거리 절단면 등을 설정한다.
  • `FloatUtil.multMatrix` 함수를 사용하여 투영 행렬과 뷰 행렬을 곱한다.
  • `transformPointer.asFloatBuffer().put(projection)`를 통해 변환 행렬을 버퍼에 저장한다.

4. 셰이더 프로그램 사용: `glUseProgram` 함수를 사용하여 렌더링에 사용할 셰이더 프로그램을 지정한다.

5. VAO(Vertex Array Object) 바인딩: `glBindVertexArray` 함수를 사용하여 사용할 VAO를 바인딩한다. VAO는 정점 데이터와 관련된 상태 정보를 저장하는 객체이다.

6. UBO(Uniform Buffer Object) 바인딩: `glBindBufferBase` 함수를 사용하여 UBO를 바인딩한다. UBO는 셰이더 프로그램에서 사용할 균일 변수(uniform variable) 데이터를 저장하는 버퍼이다.

7. 텍스처 및 샘플러 바인딩:

  • `glBindTextureUnit` 함수를 사용하여 텍스처 유닛에 텍스처를 바인딩한다.
  • `glBindSampler` 함수를 사용하여 텍스처 유닛에 샘플러를 바인딩한다. 샘플러는 텍스처를 읽을 때 사용할 필터링 및 래핑 모드를 정의한다.

8. 렌더링: `glDrawElements` 함수를 사용하여 삼각형(triangles)을 그린다. `elementCount`는 그릴 삼각형의 인덱스 개수를 나타낸다.

참조

[1] 웹사이트 Open source Java projects: Java Binding for OpenGL (JOGL) https://www.infoworl[...] 2008-09-18
[2] 웹사이트 Hello JOGL https://www.infoworl[...] 2005-02-21
[3] 웹사이트 3D & Multimedia Across Platforms and Devices Using JOGL http://jogamp.org/do[...] SIGGRAPH 2010-07-27
[4] 웹사이트 JOGL - Java Binding for the OpenGL API http://jogamp.org/jo[...]
[5] 웹사이트 JSR-000231 Java Bindings for the OpenGL API http://jcp.org/about[...] Java Community Process
[6] 웹사이트 Bug 794 - Add Wayland Windowing/Surface Interoperability https://jogamp.org/b[...] 2013-08-05
[7] 웹사이트 JOGL Userguide http://jogamp.org/jo[...]
[8] 웹인용 Open source Java projects: Java Binding for OpenGL (JOGL) http://www.javaworld[...] 인터내셔널 데이터 그룹 2008-09-18
[9] 웹인용 Hello JOGL http://www.javaworld[...] 인터내셔널 데이터 그룹 2005-02-21



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com