0

次のコードを使用して、シェーダーから属性を取得しようとしています。

このコード セグメントは、属性ではなくユニフォームを取得しています。

/*********** Get attribute locations. ***************/
// Dictionary to store each active attribute
NSMutableDictionary *m_attributes = [[NSMutableDictionary alloc] init];
int m_nAttributes = -1;
glGetProgramiv( _program, GL_ACTIVE_ATTRIBUTES, &m_nAttributes );

for(GLuint i = 0; i < m_nAttributes; i++)  {
    int name_len=-1, num=-1;
    GLenum type = GL_ZERO;
    char attributesName[100];

    glGetActiveUniform( _program, i, sizeof(attributesName)-1, &name_len, &num, &type, attributesName );

    attributesName[name_len] = 0;

    GLuint attributes = glGetUniformLocation( _program, attributesName );

    [m_attributes setObject:[NSNumber numberWithUnsignedInt:attributes]
                     forKey:[NSString stringWithUTF8String:attributesName]];        
}

ここに私のシェーダーがあります:

attribute vec3 VertexPosition;
attribute vec3 VertexNormal;
attribute vec2 VertexTexCoord0;


uniform mat4 ModelViewMatrix;
uniform mat4 ModelViewProjMatrix;


varying vec3 Normal;
varying vec2 TexCoord0;


void main(void)
 {
    Normal = VertexNormal;
        TexCoord0 = VertexTexCoord0;

    gl_Position = ModelViewProjMatrix * vec4(VertexPosition, 1.0);
 }

誰かが私が間違っていることを見ることができますか?

4

1 に答える 1

2

の代わりにglGetActiveAttrib使用し、 glGetAttribLocationの代わりに属性インデックスを取得する必要があります。glGetActiveUniformglGetUniformLocation

glGetActiveAttribハードコーディングの代わりに必要なバッファを割り当てるために、属性名の最大長も取得しますchar attributesName[100];

GLint maxNameLength;
glGetProgramiv(program_handle, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxNameLength);
于 2013-03-05T09:21:40.250 に答える