2013-07-16 3 views
2

내 GLSL 쉐이더가 AMD 및 Nvidia 하드웨어에서 작동하는 데 문제가 있습니다.Nvidia 및 AMD 용 GLSL 쉐이더 고정

특정 쉐이더를 수정하는 데 도움이되지는 않지만 일반적으로 이러한 문제를 피하는 방법은 무엇입니까? 해당 하드웨어가있는 머신에서 응용 프로그램을 실행하지 않고 실제로 쉐이더가 AMD/Nvidia 드라이버에서 컴파일되는지 여부를 확인할 수 있습니까?

결국 나는 테스트가 확실한 유일한 방법이라는 것을 알고 있지만, 개발 중에 나는 명백한 문제를 피하고 싶습니다.

GLSL을 사용하는 사람은 모두 이러한 문제가 있어야합니다. 그렇다면이를 해결할 수있는 좋은 방법을 찾을 수없는 이유는 무엇입니까?

+0

어떤 종류의 오류가 발생합니까? OpenGL4.x/glfw/glew를 사용하여 주로 함수 포인터를 수정해야했습니다. glGenVertexArrays가 AMD에서는 작동하지만 Nvidia에서는 작동하지 않는다고 가정하십시오. 따라서 함수의 주소를 찾아야합니다. glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) glfwGetProcAddress ("glGenVertexArrays"); – dinony

답변

5

해당 하드웨어가있는 컴퓨터에서 응용 프로그램을 실행하지 않고 실제로 셰이더가 AMD/Nvidia 드라이버에서 컴파일되고 실제로 시도되는지 여부를 확인할 수 있습니까? 당신이 하드웨어의 다양한 테스트 응용 프로그램을 개발하는 방법에 대한 심각하기 위하여려고하는 경우에

번호 그것에 대해 갈 수있는 신뢰할 수있는 방법입니다. 그리고 당신이 진지 해지지 않으면, 누가 걱정하는지.

일반적으로 작은 팀에서이 문제를 처리하는 가장 쉬운 방법은 문제를 완전히 피하는 것입니다. 대부분의 드라이버 비 호환성은 출력을 입력/가변 변수로 전달하고, 행렬을 특성으로 전달하고, 최신 드라이버 기능을 사용하여 등등과 같은 무언가를 시도함으로써 발생합니다. 그렇게하지 마십시오. GLSL에서 사용되어 왔고 실제 OpenGL 응용 프로그램에서 거의 확실히 사용 된 견고하고 안전한 물건 만 사용하십시오.

+1

또한 뭔가를 OpenGL 사양의 버그 또는 위반으로 식별 할 수 있고 견고한 테스트 케이스를 제공 할 수 있다면 버그 보고서를 제출하십시오. GPU 공급 업체가 드라이버, 펌웨어 또는 하드웨어의 문제를 효율적으로 해결할 수있는 유일한 방법은 최종 응용 프로그램 개발자의 의견을 얻는 것입니다. – datenwolf

+0

실제로 할 수있는 또 다른 일은'glGetShaderInfoLog'를 사용하여 경고를 확인하는 것입니다.NVidia 드라이버가 특히 받아 들일 수있는 것에 대해서는 상당히 관대하다는 것을 알았지 만, 컴파일 한 dodgy GLSL에 대한 경고를 발행합니다. – GuyRT

+0

셰이더가 두 공급 업체에 유효한지 확인할 수있는 쉬운 도구가 없다는 분명한 대답을 보내 주셔서 감사합니다. @GuyRT 이미 ShaderInfoLog를 확인 중이며 내 컴퓨터 (AMD)에는 아무것도 들어 있지 않지만 친구 컴퓨터 (Nvidia)에서는 응용 프로그램이 셰이더 컴파일 오류로 인해 충돌합니다. 예외 정보를 보내달라고하는 것보다 더 좋은 방법이 있는지 알고 싶었습니다. – Gigo

3

NVidias의 NVEmulate와 AMD의 GPU ShaderAnalyzer를 사용할 수 있습니다.

AMD의 GPU ShaderAnalyzer는 독립 실행 형 GLSL/HLSL 컴파일러입니다. NVidias의 NVEmulate는 다른 (더 우수한) NVidia 그래픽 카드의 기능을 소프트웨어로 에뮬레이션하는 도구입니다. 따라서 NVidia 카드를 가지고 있다면 테스트를 위해 프로그램을 실행하고 (NVEmulate로 다른 NVidia 카드를 에뮬레이트 할 수 있음) ShaderAnalyser를 사용하여 쉐이더가 AMD 카드에서 컴파일되는지 확인하십시오.

쉐이더가 AMD에서 실행되는 경우 NVidia에서 실행됩니다. cgc (Cg 툴킷의 일부인 NVidias 독립 실행 형 Cg 컴파일러)를 사용하여 GLSL 및 Cg 코드를 바이너리로 컴파일하거나 HLSL로 크로스 컴파일하여 테스트 할 수 있습니다. NVidia 드라이버가 GLSL 용 어쨌든 사용하는 컴파일러입니다. 낮은 수준의 최적화에 매우 유용한 셰이더의 바이너리/어셈블리 코드를 볼 수 있다는 점이 보너스입니다.

다른 하드웨어에서 쉐이더가 (예상대로) 작동한다면 아무 도구도 없다고 말할 수 있습니다. 저는 최근에 새로운 AMD 드라이버가 경고 또는 오류없이 기본 균일 값을 제대로 처리하지 못한다는 것을 알아 냈습니다. 메시지 ... 그러나 이것은 다른 이야기입니다. 그래서 어느 시점에서 대상 하드웨어에서 코드를 테스트해야합니다.

+1

자세한 내용을 포함하십시오; 이것이 의미하는 바는 이것이 대답하기에는 충분하지 않다는 것입니다. – hexafraction

+0

ShaderAnalyzer는 실제로 GLSL 컴파일러와 함께 번들링합니까? 나는 그것이 드라이버의 컴파일러와 인터페이싱한다고 생각했기 때문에 이것이 Catalyst 드라이버> = 12.x가 필요한 이유입니다. 그들은 GLSL for Radeon HD 7xxx 또는 더 새로운 GPU를위한 어셈블리를 생성하지 않습니다. - HLSL 컴파일러까지는 확실히 이것을 포함하지 않습니다. - Microsoft는 HLSL 컴파일러를 작성하는 유일한 당사자입니다. D3D 드라이버는 실제로 컴파일 된 바이트 코드로 작업하고 대상 GPU에 대한 기본 명령어로 변환합니다. –

+0

예, ShaderAnalyzer 번들 GLSL 컴파일러는 내 Nvidia 카드에서 완벽하게 작동합니다 .. 문제는 GLSL에 관한 것입니다. HLSL 컴파일러는 마이크로 소프트에 의해서만 제공되기 때문에 일반적으로 dont't는 이와 같은 문제를 가지고 있지 않습니다 ... d3d로 개발하기를 원하는 이유가 있습니다. – dvalk