[ Java JOGL 프로그래밍 ] 쉐이더 적용 및 useProgram - 3 - Whitmem
[ Java JOGL 프로그래밍 ] 쉐이더 적용 및 useProgram - 3
Graphic Development
2024-08-19 00:01 게시 e70e8f74135f75d14b9d

0
0
71
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
이번에는 기존 JOGL 프로젝트에 Shader 을 적용해보았다. Shader 적용 방법이 매우 간단하지는 않지만 어느정도 이해가 되었고 시도를 해보는 중이다.
Shader 코드는 Shadered 에서 작업을 했고, 기본 쉐이더 코드로 작성하였다. Vertex Shader
#version 330 layout (location = 0) in vec3 pos; void main() { gl_Position = vec4(pos, 1); }
#version 330 in vec4 color; out vec4 outColor; void main() { gl_FragColor= vec4(1,0,1,1); }
위 세이더 코드를 보면 알 수 있듯, 큐브를 렌더링하면 평면으로만 보인다.
그 이유는 각종 3차원 행렬을 적용하지 않았고, pos 좌표를 그대로 렌더링했기 때문에 NDC 클립 좌표 공간에 그대로 렌더링 된 것이다. 아무튼 이 각 쉐이더를 컴파일 하는 과정을 거쳐야하는데, gl 함수 중에 glCreateShader 이라는 함수가 있다. 이 함수로 어떤 타입의 쉐이더인지 타입을 넘기고, glShaderSource로 해당 쉐이더에 소스를 장착, glCompileShader로 해당 쉐이더를 컴파일하면 되는 듯 싶다.
type 은 추후 VertexShader의 경우 GL_VERTEX_SHADER을 넘기고 PixelShader(FragmentShader)의 경우 GL_FRAGMENT_SHADER 플래그를 넘겨야 한다. 또 glShaderSource 를 실행할 때 문자열 개수를 정의할 수 있는데 쉐이더 코드 문자열이 각각 한 개이므로, new String[] {shader} 로 넘겼다.
int vertexShaderIndex = compileShader(gl, vertexShader, GL2.GL_VERTEX_SHADER); int pixelShaderIndex = compileShader(gl, pixelShader, GL2.GL_FRAGMENT_SHADER)
그러면 결과적으로 각각의 쉐이더 코드를 이렇게 컴파일해서 핸들을 담아주고, 이 두 개의 쉐이더를 묶어서 처리할 쉐이더 프로그램을 생성한다.
int shaderProgramIndex = gl.glCreateProgram();
이렇게 쉐이더 프로그램이 생성됐으면, 이 쉐이더 프로그램에 각각 버텍스 쉐이더 핸들과 픽셀 쉐이더 핸들을 붙여준다.
gl.glAttachShader(shaderProgramIndex, vertexShaderIndex); gl.glAttachShader(shaderProgramIndex, pixelShaderIndex); gl.glLinkProgram(shaderProgramIndex); //두 쉐이더 링킹
그러면 이제 최종적으로 이 shaderProgramIndex Handle 을 사용해서 원하는 영역에서 useProgram 해주면 된다.
gl.glUseProgram(shader); 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); gl.glUseProgram(0);
쉐이더가 잘 적용되었다. 다음에는 uniform 값을 붙여 타임을 적용하는 방법에 대해서 기록할 예정이다. 한편 각 객체에 텍스코드 등을 Attribute 로 넘기기 위해서는 직접 버텍스와 TexCoord를 드로우 하는것이 아니라, VAO, VBO를 사용해서 넘겨야한다고 한다.
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.