three.js GPGPU SPH - GPUComputationRenderer GLSL 3 version 사용

728x90
반응형

 

glsl 3 version 사용법

three.js에서 만약 shader material을 사용한다면 glslVersion 값을 변경해서 glsl 3버전을 사용할 수 있다.

하지만 GPU computation renderer에서는 어떻게 하는지 모르겠다.

 

찾아보니 gpu computation renderer에 create shader material이라는 함수가 있다. 

하지만 결국 gpu variable을 만들때 shader material을 넣을 수 없으므로 또 무용지물..

 

결국 glsl 3 versio을 사용하는게 무리라면, 

정말로 particle 구조체를 사용하지 않고, 각 particle 의 요소들 velocity, position, density 등 각각에 대한 glsl shader를 분리해서 처리해야할 수도 있다..

 

shader material 사전코드 

일단 three.js 자체 코드를 뒤지다가 

glsl 최상단에 version을 선언하기 전에 나오는 저 LinearTransforOETF에 대해 찾았다.

shader material 모듈에 들어있었다.

 

와... 이렇게 많은 코드가 three.js에서 shader에 기본으로 들어가고 있었다니..

결국 GLSL3로 바꾸는 것은 three.js의 기능을 이용해서 하는 수밖에 없어보인다. 

 

여기 보이는 prefixFragment에 GLSL3이라면 들어가지 않도록 해놓은 분기점이 존재한다. 

fragmentGlsl 상수가 초기화되는 시점은 WebGLProgram 함수가 초기화되는 

WebGLRenderer의 parameter 설정을 잘 해야한다.

 

처음에 WebGLRenderer를 만들 때부터 parameter에 GLSL버전을 명시해야했나보다.

 

... 정말 많이 three.js 라이브러리 자체 코드를 뒤져보고 있다.

결국 webgl renderer의 context를 이용해서 webgl2로 변경한다고 한들 glsl 3를 정상적으로 사용하지는 못한다.

내부적으로는 default shader 코드가 전부 varying 등 glsl1 코드 기반으로 짜져 있는 것 같다.

 

shader glsl version 300 es 

https://discourse.threejs.org/t/gl-fragcolor-to-out-in-shader-material/27545

 

gl_FragColor to out in shader material

How can i custom out color in fragment shader? I got some errors in this code

discourse.threejs.org

이 포스팅에서 Mugen87씨가 out 키워드를 사용하는 방법을 알려준다.

이게 내쪽에서도 되는 방법인가? 

 

코드를 보고 뭐가 문제인지 볼까.

const material = new THREE.ShaderMaterial({
	vertexShader: vertex,
  fragmentShader: fragment,
  transparent: true,
  uniforms: {
  	uColor: {value: new THREE.Color('red')}
  },
  glslVersion: THREE.GLSL3
})

딱 하나 다른점. glslVersion을 설정한 것.

 

이거 하나 때문에 out 키워드를 쓸 수 있고 없고가 갈린다고?

그렇다고 하더라도, out을 여러 개 할 수 있는건가 싶다. 

 

그렇다면 gpu computation renderer의 shader material에도 glsl3 버전으로 설정할 수 없는가.. 

 

GPU Computation Renderer Shader Material

이건 GPUComputationRenderer 모듈 안에 있는 코드이다. 

보다시피 GLSL 버전 설정이 없다.

 

이걸 프로젝트에서 직접 수정해보면..? 

 

three.js GPGPU의 한계

https://discourse.threejs.org/t/multiple-outputs-in-gpucomputationrenderer/27566

 

Multiple outputs in GPUComputationRenderer

Is it possible to output multiple textures in just one shader program? I read layout qualifier but don’t know how to apply it in GPUComputationRenderer. I wanna do like this if it is possible… Here live example: https://jsfiddle.net/bemuse/r24obezw/51/

discourse.threejs.org

 

이런.. 결국 실패했다. 현재 GPUComputationRenderer에서는 명백히 glsl 3 버전을 사용할 수 없도록 되어있다.

위 포스팅이 2021년에서 2022년 답변까지 있지만, GPUComputationRenderer에서는 아직도 지원하지 않고,

더군다나 particle structure형태로 꺼내는 것은 더더욱이 그렇다.

 

결국 포기하고 glsl 1 버전으로 분리해서 진행하도록 한다. 

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유