###前提・実現したいこと
Unityで外部プラグインを作成してOpenGL ESで長方形(FillRect)を描画しようとしたところ、
「GL_INVALID_OPERATION: Operation illegal in current state」が発生し、
何も描画されない状態になってしまいます。
どこか根本的に間違っている部分や設定漏れがあるのではと考えておりますが、
数日間、原因を調査しても解決しなかったので、皆様のお力をお借りできればと思います。
お手数ですが、何卒宜しくお願い致します。
###ソースコード
c++
1// 頂点シェーダー 2#define VERTEX_C_SRC(ver, attr, varying) \ 3 ver \ 4 attr " highp vec4 a_vertex;\n" \ 5 attr " lowp vec4 a_color;\n" \ 6 "\n" \ 7 "uniform highp mat4 u_ModelViewProj;\n" \ 8 "\n" \ 9 varying " lowp vec4 v_color;\n" \ 10 "\n" \ 11 "void main()\n" \ 12 "{\n" \ 13 " gl_Position = u_ModelViewProj * a_vertex;\n" \ 14 " v_color = a_color;\n" \ 15 "}\n" \ 16 17static const char* c_VProgTextGLES2 = VERTEX_C_SRC("\n", "attribute", "varying"); 18static const char* c_VProgTextGLES3 = VERTEX_C_SRC("#version 300 es\n", "in", "out"); 19static const char* c_VProgTextGLCore = VERTEX_C_SRC("#version 150\n", "in", "out"); 20 21 22 23// フラグメントシェーダー 24#define FRAGMENT_C_SRC(ver, varying, outDecl, outVar) \ 25 ver \ 26 outDecl \ 27 varying " lowp vec4 v_color;\n" \ 28 "\n" \ 29 "void main()\n" \ 30 "{\n" \ 31 " " outVar " = v_color;\n" \ 32 "}\n" \ 33 34static const char* c_FShaderTextGLES2 = FRAGMENT_C_SRC("\n", "varying", "\n", "gl_FragColor"); 35static const char* c_FShaderTextGLES3 = FRAGMENT_C_SRC("#version 300 es\n", "in", "out lowp vec4 fragColor;\n", "fragColor"); 36static const char* c_FShaderTextGLCore = FRAGMENT_C_SRC("#version 150\n", "in", "out lowp vec4 fragColor;\n", "fragColor");
C++
1class Shader 2{ 3public: 4 GLuint m_Program; 5 GLuint m_VertShader; 6 GLuint m_FragShader; 7 GLint* m_piGLAttrib; 8 GLint m_iGLAttribNum; 9 GLint* m_piGLUniform; 10 GLint m_iGLUniformNum; 11 UnityGfxRenderer m_APIType; 12 13 Shader( const char* vert, const char* frag, const int* attribIndex, const char** attribName, int attribNum, const int* uniformIndex, const char** uniformName, int uniformNum, UnityGfxRenderer APIType) 14 { 15 m_Program = 0; 16 m_VertShader = 0; 17 m_FragShader = 0; 18 m_iGLAttribNum = 0; 19 m_piGLAttrib = NULL; 20 m_iGLAttribNum = 0; 21 m_piGLUniform = NULL; 22 m_APIType = APIType; 23 24 createShader( vert, frag, attribIndex, attribName, attribNum, uniformIndex, uniformName, uniformNum); 25 } 26 27 boolean createShader( const char* vert, const char* frag, const int* attribIndex, const char** attribName, int attribNum, const int* uniformIndex, const char** uniformName, int uniformNum) 28 { 29 // プログラムオブジェクトの作成 30 m_Program = glCreateProgram(); 31 if( m_Program == 0 ){ 32 goto _ERROR; 33 } 34 35 if( FALSE == compileShader( &m_VertShader, GL_VERTEX_SHADER, vert) ){ 36 goto _ERROR; 37 } 38 if( FALSE == compileShader( &m_FragShader, GL_FRAGMENT_SHADER, frag) ){ 39 goto _ERROR; 40 } 41 42 // シェーダオブジェクトのシェーダプログラムへの登録 43 glAttachShader( m_Program, m_VertShader ); 44 glAttachShader( m_Program, m_FragShader ); 45 46 #if SUPPORT_OPENGL_CORE 47 if (m_APIType == kUnityGfxRendererOpenGLCore) 48 glBindFragDataLocation(m_Program, 0, "fragColor"); 49 #endif // if SUPPORT_OPENGL_CORE 50 51 // シェーダプログラムのリンク 52 glLinkProgram( m_Program ); 53 54 // プログラムの検証 55 glValidateProgram( m_Program ); 56 57 // リンクフェーズで決定されたuniform locationをすべて取得 58 if( FALSE == getAttribLocations( attribIndex, attribName, attribNum ) ){ 59 goto _ERROR; 60 } 61 // リンクフェーズで決定されたattrib locationをすべて取得 62 if( FALSE == getUniformLocations( uniformIndex, uniformName, uniformNum ) ){ 63 goto _ERROR; 64 } 65 66 // シェーダオブジェクトの削除 67 releaseShader(); 68 69 return TRUE; 70 71 _ERROR: 72 release(); 73 return FALSE; 74 } 75 76 77 boolean compileShader(GLuint* shader, GLenum type, const char* source) 78 { 79 GLint iGLStatus; 80 81 if( source == NULL ){ 82 return FALSE; 83 } 84 85 *shader = glCreateShader( type ); 86 if( *shader == 0 ){ 87 goto _ERROR; 88 } 89 90 // シェーダのソースプログラムのシェーダオブジェクトへの読み込み 91 glShaderSource(*shader, 1, (const GLchar**)&source, NULL); 92 93 // シェーダのソースプログラムのコンパイル 94 glCompileShader( *shader ); 95 96 glGetShaderiv( *shader, GL_COMPILE_STATUS, &iGLStatus ); 97 if( iGLStatus == 0 ){ 98 goto _ERROR; 99 } 100 101 return TRUE; 102 103 _ERROR: 104 if( *shader ){ 105 glDeleteShader( *shader ); 106 *shader = 0; 107 } 108 return FALSE; 109 } 110 111 void releaseShader() 112 { 113 if( m_VertShader ) 114 { 115 glDeleteShader( m_VertShader ); 116 m_VertShader = 0; 117 } 118 if( m_FragShader ) 119 { 120 glDeleteShader( m_FragShader ); 121 m_FragShader = 0; 122 } 123 } 124 125 void useShader() 126 { 127 glUseProgram( m_Program ); 128 } 129 130 boolean getAttribLocations( const int* index, const GLchar** name, int32 num ) 131 { 132 glGetProgramiv( m_Program, GL_ACTIVE_ATTRIBUTES, &m_iGLAttribNum ); 133 134 m_piGLAttrib = new GLint[ num ]; 135 for( int i = 0 ; i < num ; i++ ) 136 { 137 if( m_piGLAttrib == NULL ) continue; 138 m_piGLAttrib[ index[ i ] ] = glGetAttribLocation( m_Program, name[ i ] ); 139 } 140 141 return TRUE; 142 } 143 144 boolean getUniformLocations( const int* index, const GLchar** name, int32 num ) 145 { 146 glGetProgramiv( m_Program, GL_ACTIVE_UNIFORMS, &m_iGLUniformNum ); 147 148 m_piGLUniform = new GLint[ num ]; 149 for( int i = 0 ; i < num ; i++ ) 150 { 151 if( m_piGLUniform == NULL ) continue; 152 m_piGLUniform[ index[ i ] ] = glGetUniformLocation( m_Program, name[ i ] ); 153 } 154 155 return TRUE; 156 } 157}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/14 07:18