OpenGL API에 액세스하려면 OpenTK에서 C#을 사용합니다. 내 프로젝트는 모자이크를 사용하여 하이트 맵을 렌더링합니다. 내 tessellation 컨트롤 셰이더는 정사각형을 64 개의 사각형으로 분할하고 테셀레이션 평가 셰이더는 이러한 포인트에 수직 오프셋을 추가합니다. 수직 오프셋은 다음과 같이 균일 한 float 버퍼에 저장됩니다Nvidia GPU의 균일 버퍼 크기
uniform float HeightmapBuffer[65 * 65];
모든 것이 잘 작동, 내가 AMD 라데온 8250 GPU와 내 노트북에 프로젝트를 실행할 때. 문제는 Nvidia 그래픽 카드에서 실행하려고 할 때 시작됩니다. 나는 이전 GT 430과 새로운 GTX 1060을 시도했지만 결과는 동일합니다 :이 문제를 연구로서
Tessellation evaluation info
----------------------------
0(13) : error C5041: cannot locate suitable resource to bind variable "HeightmapBuffer". Possibly large array.
, 내가 AMD 모두 엔비디아 칩에 65.54 킬로바이트에 ~이 500MB 반환 GL_MAX_UNIFORM_BLOCK_SIZE
변수를 발견했다. 내 배열은 실제로 16.9 kB만을 사용하기 때문에 조금 이상합니다. 따라서 "BLOCK SIZE"가 실제로 하나의 변수의 크기를 제한하는지 확실하지 않습니다. 어쩌면 하나의 셰이더에 전달 된 모든 유니폼의 크기를 제한 할 수 있습니까? 그럼에도 불구하고, 나는 내 프로그램이 65 kB를 사용한다고 믿을 수 없다.
텍스처를 사용하여 '일반적인'방법으로 시도했지만, 보간에 문제가 있다고 생각합니다. 두 개의 인접한 높이 맵을 함께 배치하면 테두리가 일치하지 않습니다. 다른쪽에 균일 한 버퍼 배열을 사용하면 모든 것이 완벽하게 작동합니다.
GL_MAX_UNIFORM_BLOCK_SIZE
의 실제 의미는 무엇입니까? 왜 Nvidia GPU에서이 값이 그렇게 낮습니까? 셰이더에 큰 배열을 전달하는 다른 방법이 있습니까?
'float' 유니폼은 실제로'vec4'의 크기이므로'4 바이트 * 4 * 65 * 65' ='67.6 KiB'입니다. – genpfault
흠, GL 사양에서 정보를 소싱하는 데 어려움을 겪고 있습니다. 그래서 소금 한 알씩 가져 가야합니다. ES 2.0 사양을 기억할 수도 있습니다. – genpfault
[큰 배열의 기하학 쉐이더 오류] (https://stackoverflow.com/questions/29262469/error-in-geometry-shader-from-large-array) – Gusman