1

私は次の頂点シェーダーを持っています:

uniform mediump mat4 projMx;

attribute vec2 a_position;      
attribute vec4 a_color;     
attribute float a_radius;       
varying vec4 v_color;
void main()
{
    vec4 position = vec4(100.0,600.0,1.0,1.0);
    gl_Position = projMx * position;
    gl_PointSize = a_radius*2.0;
    v_color = a_color;
}

..そして次のフラグメントシェーダー

#ifdef GL_FRAGMENT_PRECISION_HIGH
    precision highp float;
#else
    precision mediump float;
#endif

varying vec4 v_color;
void main()
{
    gl_FragColor = v_color;
}

..そして次のObj-Cコード

    //..shaders have been created..
program = glCreateProgram();
glAttachShader(program, shaders[0]);
glAttachShader(program, shaders[1]);

GLfloat projMx[16] = {2/screenWidth,0,0,-1,0,2/-screenHeight,0,1,0,0,-2,-1,0,0,0,1};

projMxId = glGetUniformLocation(program, "projMx");
NSLog(@"uniform location:%i",projMxId);

'projMx'の均一な位置は-1です(つまり、'projMxId == -1'はtrueです)。誰かがこれが事実である理由を説明できますか?

4

1 に答える 1

3

これらはプログラムごとの状態であり、プログラムのすべてのシェーダーで認識されているため、プログラムをリンクした後でのみ、均一な場所を取得できます(実行しないこと)。GLSLコンパイラは、リンク中に未使用のユニフォームを最適化できるため、リンク後にのみ位置を知る必要があります。これは、明示的にバインドされていないすべての属性が位置を取得する瞬間でもあります。

于 2011-08-29T17:43:17.733 に答える