2017-09-28 11 views
1

Win10 PCでRenderMonkey 1.82を使用しようとしましたが、グラフィックカードはNVIDIA Geforce 405 v342.01です。私はそれに付属のOpenGL ESの例を使用することはできません。私はいったん別のマシンでこれを行うことができたら覚えています。これは互換性の問題ですか?RenderMonkey opengles exampleコンパイルがエラー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

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)。また、予約されている「GL_」(単一 下線が続く「GL」)が付い

すべてのマクロ名を、そして コンパイルこのような名前の結果を定義する:GLSL ES spec

は、それが述べ時間エラー。

したがって、実際には仕様に違反しているため、ドライバは正しいことを行い、このシェーダを拒否しています。おそらく、非常に古いNVIDIAドライバでは、このエラーは報告されていませんでした。この問題を解決するためにRenderMonkeyを再コンパイルする必要があります。ソースは公開されていません。

ただし、をハックするとRenderMonkeyでこれらのシェーダをコンパイルできます。先頭に追加される余分な文字列は、平文でlibGLESv2.dllに含まれており、16進エディタを使用して、GL_で始まらないものに変更することができます。オフセット0x16052Eと0x1606A0で発生します。

GLSLとGLSL ESは非常に似ているため、代わりにシェーダの開発にGL2ワークスペースを使用してください。

関連する問題