2012-07-11 4 views
5

OpenGL ES 및 OpenGL (Windows)과 동일한 쉐이더 소스를 원합니다. 이렇게하려면 사용자 지정 데이터 형식을 정의하고 OpenGL ES 기능 만 사용하고 싶습니다. 윈도우 쉐이더에 대한OpenGL ES 및 OpenGL 호환 쉐이더

#define highp 
#define mediump 
#define lowp 

하고는 OpenGL ES를 위해 그대로 쉐이더를 쓰기 :

한 가지 방법은 정의하는 것입니다.

다른 접근 방식의 OpenGL ES에 대해 다음과 같이 사용자 정의 데이터 형식을 정의하는 것입니다 :

#define hvec2 highp vec2 

및 Windows

#define hvec2 vec2 

이 같은

당신이 더에 대해 어떻게 생각하십니까? 이 문제에 대한 다른 해결책이 있습니까?

답변

4

내 솔루션의 OpenGL ES에 조각 쉐이더 소스 코드를 업로드 할 때 바로 다음 줄을 앞에 추가 한 후 두 API와 호환되며, 쉐이더 코드를 작성하는 것이 었습니다 :

precision mediump float; 

기본값을 설정 즉, 부동 소수점 정밀도를 중간으로. OpenGL ES 조각 셰이더에는 부동 소수점 값에 대한 기본 정밀도 수준이 없습니다. 즉, 모든 부동 소수점 선언에 정밀도를 지정하거나 명시 적으로 기본 정밀도를 설정해야합니다. 응용 프로그램에 더 적합한 경우 lowp 또는 highp을 사용할 수 있습니다. 당신이 당신의 쉐이더에서 정밀 세밀하게 제어해야하는 경우 http://www.khronos.org/files/opengles_shading_language.pdf

당신은 또한 당신의 #define 접근 방식이 방식을 혼합 할 수 있습니다 : 자세한 내용은

는 OpenGL을 ES 쉐이딩 언어 사양의 섹션 4.5.3을 참조하십시오.

4

당신은이 확장의 OpenGL 3.x에서에서 누락는 OpenGL ES 2.0의 기능에 대한 지원을 추가 http://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt

사용할 수 있습니다 이러한 기능을 사용하면 OpenGL ES 2.0에서 OpenGL로 응용 프로그램을 이식하는 프로세스가 쉬워집니다.

+0

누구가 어떻게 작동하는지 알고 있습니까? 필자는 스펙을 살펴 보았지만 GLSL ES (버전 100)와 GLSL (버전 150)이 어떻게 호환되는지 전혀 알 수 없습니다. –

+0

나중에 참조하기 위해 ES2_compatibility에서 OpenGL 3.2> 컨텍스트가 맨 위에 #version 100이있는 ES 2.0 셰이더를로드 할 수 있음을 발견했습니다. –

1

가 난 그냥 셰이더 창에서 실행될 때 각 쉐이더의 시작에서 다음을 정의하여 관리 :

#define lowp 
#define mediump 
#define highp 

추가 내가 쉐이더에게 플랫폼 이서가 사용되는 정보를 제공 (WINDOWS, 모바일, IOS) 이 방법으로 사용할 수 있습니다 :

#ifdef WINDOWS 
precision mediump float; 
#endif 
+0

덧글의 상단 부분에 대한 강화 된 upvote - 나는 정밀도 수정자를 포함하고 관련이없는 플랫폼에서 버리는 것이 훨씬 더 가치가 있다고 생각합니다. 그러나'#ifdef GL_ES' (와'# ifndef')는 조건부로 컴파일하는 가장 쉬운 방법입니다. – Tommy