Сбой при компиляции примера opender для RenderMonkey с ошибкой C0118: макросы с префиксом "GL_" зарезервированы
Я пытаюсь использовать RenderMonkey 1.82 на ПК с Win10, а видеокарта - NVIDIA Geforce 405 v342.01. Я не могу использовать примеры OpenGL ES, которые идут с ним. Я помню, как однажды я мог сделать это на другой машине. Это проблема совместимости?
Вершинный шейдер:
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
1 ответ
RenderMonkey добавляет кучу определений в шейдеры перед отправкой их в компилятор 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 для фрагментных шейдеров).
В спецификации GLSL ES говорится:
Все имена макросов с префиксом "GL_" ("GL", за которым следует одно подчеркивание) также зарезервированы, и определение такого имени приводит к ошибке во время компиляции.
Таким образом, ваш драйвер делает правильные вещи и отвергает этот шейдер, потому что он фактически нарушает спецификацию. Вероятно, в очень старых драйверах Nvidia об этой ошибке не сообщалось. Вам нужно будет перекомпилировать RenderMonkey, чтобы свойство решило эту проблему, а источники не являются общедоступными.
Тем не менее, вы можете взломать RenderMonkey, чтобы получить это для компиляции этих шейдеров. Эти дополнительные строки, которые находятся в начале, содержатся в libGLESv2.dll
в простом тексте, и вы можете использовать шестнадцатеричный редактор, чтобы изменить их на что-то, что не начинается с GL_
, Они происходят со смещением 0x16052E и 0x1606A0.
Или вместо этого просто используйте рабочие пространства GL2 для разработки ваших шейдеров, поскольку GLSL и GLSL ES очень похожи.