質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

解決済

OpenGL ESで長方形を描画すると「GL_INVALID_OPERATION: Operation illegal in current state」が発生します

fumiasi
fumiasi

総合スコア12

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

2回答

0リアクション

0クリップ

3920閲覧

投稿2017/05/13 15:59

###前提・実現したいこと
Unityで外部プラグインを作成してOpenGL ESで長方形(FillRect)を描画しようとしたところ、
「GL_INVALID_OPERATION: Operation illegal in current state」が発生し、
何も描画されない状態になってしまいます。

どこか根本的に間違っている部分や設定漏れがあるのではと考えておりますが、
数日間、原因を調査しても解決しなかったので、皆様のお力をお借りできればと思います。
お手数ですが、何卒宜しくお願い致します。

###ソースコード

c++

// 頂点シェーダー #define VERTEX_C_SRC(ver, attr, varying) \ ver \ attr " highp vec4 a_vertex;\n" \ attr " lowp vec4 a_color;\n" \ "\n" \ "uniform highp mat4 u_ModelViewProj;\n" \ "\n" \ varying " lowp vec4 v_color;\n" \ "\n" \ "void main()\n" \ "{\n" \ " gl_Position = u_ModelViewProj * a_vertex;\n" \ " v_color = a_color;\n" \ "}\n" \ static const char* c_VProgTextGLES2 = VERTEX_C_SRC("\n", "attribute", "varying"); static const char* c_VProgTextGLES3 = VERTEX_C_SRC("#version 300 es\n", "in", "out"); static const char* c_VProgTextGLCore = VERTEX_C_SRC("#version 150\n", "in", "out"); // フラグメントシェーダー #define FRAGMENT_C_SRC(ver, varying, outDecl, outVar) \ ver \ outDecl \ varying " lowp vec4 v_color;\n" \ "\n" \ "void main()\n" \ "{\n" \ " " outVar " = v_color;\n" \ "}\n" \ static const char* c_FShaderTextGLES2 = FRAGMENT_C_SRC("\n", "varying", "\n", "gl_FragColor"); static const char* c_FShaderTextGLES3 = FRAGMENT_C_SRC("#version 300 es\n", "in", "out lowp vec4 fragColor;\n", "fragColor"); static const char* c_FShaderTextGLCore = FRAGMENT_C_SRC("#version 150\n", "in", "out lowp vec4 fragColor;\n", "fragColor");

C++

class Shader { public: GLuint m_Program; GLuint m_VertShader; GLuint m_FragShader; GLint* m_piGLAttrib; GLint m_iGLAttribNum; GLint* m_piGLUniform; GLint m_iGLUniformNum; UnityGfxRenderer m_APIType; 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) { m_Program = 0; m_VertShader = 0; m_FragShader = 0; m_iGLAttribNum = 0; m_piGLAttrib = NULL; m_iGLAttribNum = 0; m_piGLUniform = NULL; m_APIType = APIType; createShader( vert, frag, attribIndex, attribName, attribNum, uniformIndex, uniformName, uniformNum); } boolean createShader( const char* vert, const char* frag, const int* attribIndex, const char** attribName, int attribNum, const int* uniformIndex, const char** uniformName, int uniformNum) { // プログラムオブジェクトの作成 m_Program = glCreateProgram(); if( m_Program == 0 ){ goto _ERROR; } if( FALSE == compileShader( &m_VertShader, GL_VERTEX_SHADER, vert) ){ goto _ERROR; } if( FALSE == compileShader( &m_FragShader, GL_FRAGMENT_SHADER, frag) ){ goto _ERROR; } // シェーダオブジェクトのシェーダプログラムへの登録 glAttachShader( m_Program, m_VertShader ); glAttachShader( m_Program, m_FragShader ); #if SUPPORT_OPENGL_CORE if (m_APIType == kUnityGfxRendererOpenGLCore) glBindFragDataLocation(m_Program, 0, "fragColor"); #endif // if SUPPORT_OPENGL_CORE // シェーダプログラムのリンク glLinkProgram( m_Program ); // プログラムの検証 glValidateProgram( m_Program ); // リンクフェーズで決定されたuniform locationをすべて取得 if( FALSE == getAttribLocations( attribIndex, attribName, attribNum ) ){ goto _ERROR; } // リンクフェーズで決定されたattrib locationをすべて取得 if( FALSE == getUniformLocations( uniformIndex, uniformName, uniformNum ) ){ goto _ERROR; } // シェーダオブジェクトの削除 releaseShader(); return TRUE; _ERROR: release(); return FALSE; } boolean compileShader(GLuint* shader, GLenum type, const char* source) { GLint iGLStatus; if( source == NULL ){ return FALSE; } *shader = glCreateShader( type ); if( *shader == 0 ){ goto _ERROR; } // シェーダのソースプログラムのシェーダオブジェクトへの読み込み glShaderSource(*shader, 1, (const GLchar**)&source, NULL); // シェーダのソースプログラムのコンパイル glCompileShader( *shader ); glGetShaderiv( *shader, GL_COMPILE_STATUS, &iGLStatus ); if( iGLStatus == 0 ){ goto _ERROR; } return TRUE; _ERROR: if( *shader ){ glDeleteShader( *shader ); *shader = 0; } return FALSE; } void releaseShader() { if( m_VertShader ) { glDeleteShader( m_VertShader ); m_VertShader = 0; } if( m_FragShader ) { glDeleteShader( m_FragShader ); m_FragShader = 0; } } void useShader() { glUseProgram( m_Program ); } boolean getAttribLocations( const int* index, const GLchar** name, int32 num ) { glGetProgramiv( m_Program, GL_ACTIVE_ATTRIBUTES, &m_iGLAttribNum ); m_piGLAttrib = new GLint[ num ]; for( int i = 0 ; i < num ; i++ ) { if( m_piGLAttrib == NULL ) continue; m_piGLAttrib[ index[ i ] ] = glGetAttribLocation( m_Program, name[ i ] ); } return TRUE; } boolean getUniformLocations( const int* index, const GLchar** name, int32 num ) { glGetProgramiv( m_Program, GL_ACTIVE_UNIFORMS, &m_iGLUniformNum ); m_piGLUniform = new GLint[ num ]; for( int i = 0 ; i < num ; i++ ) { if( m_piGLUniform == NULL ) continue; m_piGLUniform[ index[ i ] ] = glGetUniformLocation( m_Program, name[ i ] ); } return TRUE; } }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。