2017-09-28 4 views
1

J'essaie d'utiliser RenderMonkey 1.82 sur Win10 PC, et la carte graphique est NVIDIA Geforce 405 v342.01. Je ne peux pas utiliser les exemples OpenGL ES qui l'accompagnent. Je me souviens d'une fois que je pouvais le faire sur une autre machine. Est-ce un problème de compatibilité?RenderMonkey opengles Exemple de compilation échouée avec erreur C0118: les macros préfixées par 'GL_' sont réservées

Vertex shader:

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; 


} 

shader Fragment:

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; 

} 

Le message d'erreur est:

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 

Répondre

0

RenderMonkey ajoute un tas de définitions sur les shaders avant de les envoyer à la Compilateur GLSL. Vous pouvez le vérifier en l'exécutant via CodeXL, puis en inspectant le texte des shaders. Pour ma machine, cela semble être la norme (pour les vertex shaders, fragment shaders sont similaires):

#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 

Comme vous pouvez le voir, sur la ligne 8, #define GL_ES est l'erreur que vous frappiez (et cela se produit en ligne 3 pour les shaders fragmentés).

Dans le GLSL ES spec, il est écrit:

Tous les noms de macro préfixées avec « GL_ » (« GL » suivi d'un seul underscore) sont également réservés, et définir un tel nom résulte dans une compilation erreur de temps.

Ainsi, votre pilote fait la bonne chose et rejette ce shader car il viole la spécification. Probablement dans les très vieux pilotes Nvidia, cette erreur n'a pas été rapportée. Vous devrez recompiler RenderMonkey en propriété résoudre ce problème et les sources ne sont pas publiques.

Toutefois,, vous pouvez pirater RenderMonkey pour obtenir ceci pour compiler ces shaders. Ces chaînes supplémentaires qui sont préfixées sont contenues dans le libGLESv2.dll en texte brut, et vous pouvez utiliser un éditeur hexadécimal pour les changer en quelque chose qui ne commence pas par GL_. Ils se produisent à des décalages 0x16052E et 0x1606A0.

Ou, utilisez simplement les espaces de travail GL2 pour développer vos shaders, puisque GLSL et GLSL ES sont très similaires.