18

iOS と OpenGL ES で基本的なゲームを開発しようとしていますが、ユニフォームに関するこの問題に行き詰まっています。ユニフォームに値を渡すコードは次のとおりです。

glBindVertexArrayOES(_vertexArray);

// Render the object with ES2
glUseProgram(self.shaderProgram);

glUniformMatrix4fv(uniformModelViewProjection, 1, 0, modelViewProjectionMatrix.m);

// Get uniform center position
glUniform4fv(uniformCenterPosition, 1, centerPosition.v);
// Get uniform time position
glUniform1f(uniformTime, time);

// Set the sampler texture unit to 0
glUniform1i(uniformTexture, 0);
glDrawArrays(GL_POINTS, 0, numVertices);

glUseProgram の前、glDrawArrays 呼び出しが行われる前に、glUniform 関数を配置するように注意が払われていることに注意してください。均一な位置もトレースで確認できるようにきれいに見えます。XCode で OpenGL ES アナライザー ツールを実行すると、次のようになります。

ここに画像の説明を入力

glUniform4fv に対して GL_INVALID_OPERATION を返します。表された値が正しいように見えることに注意してください。

ドキュメントから見つけたGL_INVALID_OPERATIONエラーの考えられる原因は次のとおりです。

  • 現在のプログラム オブジェクトはありません。
  • シェーダーで宣言された均一変数のサイズが、glUniform コマンドで示されたサイズと一致しません。
  • この関数の符号付きまたは符号なし整数バリアントの 1 つを使用して、float、vec2、vec3、vec4、またはこれらの配列の型の一様変数をロードするか、またはこの関数の浮動小数点バリアントの 1 つを使用してロードする場合タイプ int、ivec2、ivec3、ivec4、unsigned int、uvec2、uvec3、uvec4、またはこれらの配列の均一変数。
  • この関数の符号付き整数バリアントの 1 つを使用して、型 unsigned int、uvec2、uvec3、uvec4、またはこれらの配列の均一変数をロードします。
  • この関数の符号なし整数バリアントの 1 つを使用して、int、ivec2、ivec3、ivec4、またはこれらの配列の型の一様変数をロードします。
  • location は、現在のプログラム オブジェクトに対して無効な一様な場所であり、場所は -1 に等しくありません。
  • count が 1 より大きく、指定された一様変数が配列変数ではありません。
  • glUniform1i と glUniform1iv 以外のコマンドを使用してサンプラーが読み込まれます。

なぜ私がこのエラーを受け取っているのかを説明しているようには見えません。それは私を夢中にさせています、助けてください!

4

1 に答える 1

11

それが解決策であることが判明したため、私のコメントを回答として追加します。

そのリストから私が想像できる唯一の原因は、ポイント 2 と 3 です。

  • シェーダーで宣言された均一変数のサイズが、glUniform コマンドで示されたサイズと一致しません。
  • この関数の符号付きまたは符号なし整数バリアントの 1 つを使用して、float、vec2、vec3、vec4、またはこれらの配列の型の一様変数をロードするか、この関数の浮動小数点バリアントの 1 つを使用してロードする場合タイプ int、ivec2、ivec3、ivec4、unsigned int、uvec2、uvec3、uvec4、またはこれらの配列の均一変数。

したがって、対応する均一変数が実際vec4にシェーダーのように宣言されていることを確認してください (おそらくそれはvec3? です)。

于 2013-02-07T14:33:41.807 に答える