2017-11-23 16 views
0

주 창에 QOpenGLWidget을 사용하는 Qt 앱이 있습니다. QOpenGLFunctions를 사용하여 OpenGL 기능을 해결하는 OpenGL ES 2.0을 사용하여 그립니다. 모든 것은 Windows와 Linux에서 완벽하게 작동합니다 (동일한 Qt 앱 사용). Qt 5와 Qt Creator를 3 가지 플랫폼 모두에서 사용합니다.OpenGL ES 2.0은 Windows 및 Linux에서 작동하지만 Mac에서는 작동하지 않습니다.

그러나 Mac에서는 그래픽 그리기가 작동하지 않습니다. 처음으로 응용 프로그램을 실행하면 셰이더 프로그램을 컴파일 할 수 없어 추락했습니다. '정밀도'키워드가 구문 상 올바르지 않다고 불평했습니다. 이것은 셰이더 컴파일러가 셰이더 언어의 다른 버전을 기대하고 있음을 나타냅니다.

셰이더 프로그램의 시작 부분에 '#version 100'을 삽입하려고 시도했지만 도움이되지 않았습니다. 이번에는 버전 100이 지원되지 않았습니다.

셰이더에서 '정밀도'문을 삭제하면 디스플레이에 그래픽이 표시 될 수 있습니다. 그러나 디스플레이가 잘못되었습니다 - 일부 그래픽이 누락되었습니다. 투명도가없는 픽셀 (알파 = 1) 만 그렸습니다.

OpenGL ES 2.0 사용의 정확성을 확신합니다. Windows 및 Linux에서 Qt로 작업하는 것 외에도 동일한 코드가 Android (원시 코드) 및 iOS의 Qt 외부에서 완벽하게 작동하기 때문에 OpenGL ES 2.0 사용의 정확성을 확신합니다.

Qt 문서에 따르면 QOpenGLFunctions '는 OpenGL ES 2.0 API에 대한 교차 플랫폼 액세스를 제공합니다. 그건 사실이 아닌 것 같습니다.

이 문제를 해결할 수 있습니까? 나는 몇 시간을 찾아서 아무것도 찾지 못했다.

+0

QSurfaceFormat :: setProfile()을 사용하고 있습니까? (애플은 win/linux와 같은 프로파일을 사용하지 않는다.) 만약 당신이'Qt 5.1'을 사용하지 않는다면, QOpenGLContext :: versionFunctions()는이 시나리오에 관계없이 당신을 도울 것입니다.'Qt 5.1 '을 사용한다면'QAbstractOpenGLFunctions'이 도움이 될 수 있습니다. http://qt.apidoc.info/5.1.1/qtgui/qabstractopenglfunctions.html#details –

+0

나는 그것을 시도했다. 도움이되지 않았다. OpenGL ES 2.0 컨텍스트를 명시 적으로 요구하면 검은 색 화면과 '컨텍스트 생성 실패'오류가 발생했습니다. 현재 셰이더에서 '정밀도'를 제거하여 위에서 언급 한 것처럼 픽셀 투명도를 제외한 모든 작업을 수행 할 수 있습니다. –

+0

이 시점에서 나의 다른 제안은 어쩌면이 문제를 살펴 보는 것입니다 (저자는 자신의 문제에 대한 해결책을 게시합니다). https://stackoverflow.com/q/23779357/499581 –

답변

0

여기가 수정되었습니다. 그것은 효과가 있지만, 나는 아직도 더 정확한 수정과 정확히 무엇이 일어나는지에 대한 설명에 관심이 있습니다.

문제의 원인은 두 가지로 보입니다. 셰이더 컴파일러는 OpenGL ES 버전의 GLSL 셰이더 언어를 지원하지 않으며 OpenGL ES 구현은 모든 혼합 모드, 특히 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)을 지원하지 않습니다.

여기에 당신이 무엇을 :

  1. 는 쉐이더 프로그램의 모든 precision 규정이나 문을 제거합니다. 이것은 lowp, mediumphighp을 무조건 쉐이더 프로그램의 시작 부분에 정의하고 해당 플랫폼 (Mac의 Qt)에서만 수행하는 #define 문을 표준 방식으로 추가하여 수행 할 수 있습니다.

  2. 블렌드 기능 glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);을 사용하십시오.

  3. 모든 투명 색상에 미리 곱한 알파를 사용하십시오.

  4. 조각 쉐이더에서 색상을 조정할 때 색상의 모든 구성 요소에 gl_FragColor.w *= alpha; 대신 gl_FragColor *= vec4(alpha);의 알파 값을 곱하십시오. R, G 또는 B 구성 요소가 알파 값보다 크지 않도록 사전 처리 알파를 사용할 때 불법이며 투명 색상이 그려지지 않은 원인 일 가능성이 높습니다.