2011-07-22 5 views
3

iOS用の単純なOpenGL ES 2.0アプリケーションを作成しています。私はこれまで、glEnableVertexAttribArrayを2つの属性(位置と色)に対して呼び出すと、glGetAttribLocationが1の位置を返し、0の色が返され、glGetUniformLocationがMVPの0を返すことがわかったマトリックス。 0が有効な値であるかどうか、またはglDrawArraysが呼び出されたときにglEnableVertexAttribArrayがEXC_BAD_ACCESSを引き起こしているように見える理由はわかりません。ここでglGetAttribLocation/glGetUniformLocationは0を返し、glDrawArraysコール(iOS)でEXC_BAD_ACCESSを引き起こします。

は私のコードです:

compileShaders機能:

-(void)compileShaders { 
GLuint vertShader = [self compileShader:@"Shader" ofType:GL_VERTEX_SHADER]; 
GLuint fragShader = [self compileShader:@"Shader" ofType:GL_FRAGMENT_SHADER]; 

GLuint program = glCreateProgram(); 
glAttachShader(program, vertShader); 
glAttachShader(program, fragShader); 
glLinkProgram(program); 

GLint success; 
glGetProgramiv(program, GL_LINK_STATUS, &success); 
if (success == GL_FALSE) { 
    GLchar messages[256]; 
    glGetProgramInfoLog(program, sizeof(messages), 0, &messages[0]); 
    NSLog(@"%@", [NSString stringWithUTF8String:messages]); 
    exit(1); 
} 

glUseProgram(program); 

_positionSlot = glGetAttribLocation(program, "position"); 
_colorSlot = glGetAttribLocation(program, "color"); //Returns 0 
_mvpSlot = glGetUniformLocation(program, "MVP"); //Returns 0 

if (!_positionSlot || !_colorSlot || !_mvpSlot) { 
    NSLog(@"Failed to retrieve the locations of the shader variables:\n Position:%i\n Color:%i\n MVP:%i", _positionSlot, _colorSlot, _mvpSlot); //Prints out the values of 1, 0, 0 
} 

glEnableVertexAttribArray(_positionSlot); 
glEnableVertexAttribArray(_colorSlot); 

My機能をレンダリング:

-(void)render:(CADisplayLink *)displayLink { 
glClearColor(0.5, 0.5, 0.5, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glEnable(GL_DEPTH_TEST); 

GLfloat mvp[16] = { 
    1.0f, 0.0f, 0.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 0.0f, 
    0.0f, 0.0f, 1.0f, 0.0f, 
    0.0f, 0.0f, 0.0f, 1.0f, 
}; 

glUniformMatrix4fv(_mvpSlot, 1, 0, mvp); 

glViewport(0, 0, width, height); 

glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, 0, vertices); 
glVertexAttribPointer(_colorSlot, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, colors); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

[_context presentRenderbuffer:GL_RENDERBUFFER]; 
} 

そして、私の頂点シェーダ:

attribute vec4 position; 
attribute vec4 color; 

uniform mat4 MVP; 

varying vec4 v_color; 

void main(void) { 
    gl_Position = MVP * position; 
    v_color = color; 
} 

答えて

6

0は有効です。値、-1は「エラー」または「見つからない」値。一様な場所とattribの場所のスペースは分かれているので、場所0の均一性と場所0の属性の両方を持つことは問題ありません。

頂点と色の配列を投稿して、正しいサイズであるかどうかを確認してください。クラッシュする可能性があります。

1

私は同じ問題を抱えていますが、解決策はありませんが、私は広範にデバッグしようとしていますので、おそらく共有するのが役に立つかもしれないと思いました。

私はこの問題をglCreateProgram()glCreateShader()コールに追跡しました。どちらもエラーリターンであるゼロを返します。しかし、どちらの場合もglGetError()GL_NO_ERRORを返します。実際には、create呼び出しの後にコンパイルとリンクチェーンを通してすべてのエラーがポップアップすることはありません。

私はglGetAttribLocationと同じ症状があります。また、ユニフォームは常にゼロ(エラーではなく!)を返します。しかし、私は壊れたシェーダファイルを供給することもでき、コンパイルエラーやログ情報につながることはありません。正しい文字列がチェックされてコンパイルされました。

明らかにglCreateProgramがエラーを設定していますが、エラーを設定していないため、私はこの動作によって完全に馬鹿馬鹿しくなっています。そして、なぜそれがエラーを起こすのか、私には明らかではありません。特に混乱しているのは、GL関数呼び出し全体がエラーを返さないということです。プログラムがglUniformMatrix4fv()glUniform1i()のように統一的に動作するgl関数を呼び出すと、最初のエラーが発生します。しかし、すべてのユニフォームがすべてゼロになることはできないが、すべてのユニフォームが0として戻ってくるので、明らかに物事は壊れている。

編集:解決策が私のケースで見つかりました。 Opengles1は、フレームバッファが設定されているときにはかなり柔軟に見えます。しかし、問題を解決するためにシェーダを使用する前にフレームバッファ設定を強制する必要がありました。例えば古いeaglviewテンプレートに従うとフレームバッファはlayoutSubviewsに作成されますが、これはシェーダの典型的な初期化では遅すぎます(initwithcoder)。症状は上記の症状です。

+0

@Matias:実際にはありません。 0は、glCreateProgram()とglCreateShader()の両方に対するエラー戻り値です。 http://www.opengl.org/sdk/docs/man/xhtml/glCreateShader.xmlおよびhttp://www.opengl.org/sdk/docs/man/xhtml/glCreateProgram.xmlを参照してください。今それは私のために固定されている、私はそれぞれのためのゼロ以外のリターンを得る。 –

関連する問題