2017-09-28 30 views
1

Win10 PC에서 RenderMonkey 1.82를 사용하려고하는데 그래픽 카드는 NVIDIA Geforce 405 v342.01입니다. 함께 제공되는 OpenGL ES 예제를 사용할 수 없습니다. 다른 컴퓨터에서이 작업을 수행 할 수있게되면 기억합니다. 호환성 문제입니까?RenderMonkey opengles 예제 컴파일이 오류로 실패했습니다. C0118 : 매크로 접두사 'GL_'가 예약되었습니다.

버텍스 쉐이더 :

uniform mat4 view_proj_matrix; 
uniform vec4 view_position; 

attribute vec4 rm_Vertex; 
attribute vec3 rm_Normal; 

varying vec3 vNormal; 
varying vec3 vViewVec; 

void main(void) 
{ 
    gl_Position = view_proj_matrix * rm_Vertex; 

    // World-space lighting 
    vNormal = rm_Normal; 
    vViewVec = view_position.xyz - rm_Vertex.xyz; 


} 

조각 쉐이더 :

precision mediump float; 
uniform vec4 color; 

varying vec3 vNormal; 
varying vec3 vViewVec; 

void main(void) 
{ 
    float v = 0.5 * (1.0 + dot(normalize(vViewVec), vNormal)); 
    gl_FragColor = v * color; 

} 

오류 메시지는 다음과 같습니다

OpenGL ES Preview Window: Compiling vertex shader API(OpenGL ES) 
/../Plastic_OpenGL_ES/Single Pass/Vertex Program/ ... failure 

0(8) : 
error C0118: macros prefixed with 'GL_' are reserved 

OpenGL ES Preview 
Window: Compiling fragment shader API(OpenGL ES) 
/../Plastic_OpenGL_ES/Single Pass/Fragment Program/ ... failure 

0(3) : 
error C0118: macros prefixed with 'GL_' are reserved 

RENDERING 
ERROR(s): Vertex program 'Vertex Program' failed to compile in pass 
'Single Pass'. See Output window for details Fragment program 

'Fragment Program' failed to compile in pass 'Single Pass'. See 
Output window for details 

답변

0

렌더가에 보내기 전에 쉐이더에 정의의 무리에 추가 GLSL 컴파일러. CodeXL을 실행 한 다음 쉐이더의 텍스트를 검사하여이를 확인할 수 있습니다. 당신이 볼 수 있듯이

#version 120 
attribute float _J_K_; 
void _VSh();void main() 
{ 
    _VSh(); gl_Position += (vec4(_J_K_) - vec4(_J_K_)); 
} 
#define main _VSh 
#define GL_ES 
#define highp 
#define mediump 
#define lowp 
#define invariant 
#define gl_MaxVertexAttribs 15 
#define gl_MaxVertexUniformVectors 224 
#define gl_MaxVaryingVectors 8 
#define gl_MaxVertexTextureImageUnits 0 
#define gl_MaxCombinedTextureImageUnits 8 
#define gl_MaxTextureImageUnits 8 
#define gl_MaxFragmentUniformVectors 256 
#define gl_MaxDrawBuffers 1 

이, 8 행에 #define GL_ES 당신이 타격 오류입니다 (이 라인에서 발생 : 내 컴퓨터의 경우,이 표준이 될 것으로 보인다 (버텍스 셰이더, 조각 쉐이더는 유사하다) 3 : 조각 쉐이더). 또한 예약 된 "GL_"(단일 밑줄 다음에 "GL")로 시작

모든 매크로 이름을, 그리고 컴파일에 같은 이름의 결과를 정의하는 다음 GLSL ES spec에서

, 그것은 상태 - 시간 오류.

따라서 드라이버는 올바른 것을하고 실제로이 사양을 위반하기 때문에이 셰이더를 거부합니다. 아마도 아주 오래된 Nvidia 드라이버에서이 오류는보고되지 않았습니다. 이 문제를 해결하기 위해 RenderMonkey를 다시 컴파일해야하며 소스는 공개되지 않습니다.

그러나 RenderMonkey를 해킹하면이 셰이더를 컴파일 할 수 있습니다. 앞에 추가되는 이러한 추가 문자열은 libGLESv2.dll에 일반 텍스트로 포함되어 있으며 16 진수 편집기를 사용하여 GL_으로 시작하지 않는 문자열로 변경할 수 있습니다. 오프셋 0x16052E 및 0x1606A0에서 발생합니다.

GLSL과 GLSL ES가 매우 유사하므로 셰이더 개발에 GL2 작업 공간을 사용하십시오.