1

私はこれに対する答えをしばらく探しましたが、あまり運がありません。私がやろうとしているのは、通常のデータを頂点シェーダーに渡すことだけです。位置は正しく渡されますが、シェーダーをロードしようとすると「通常の属性が見つかりません」というエラーが表示されます。

私の ATTRIB 値は列挙型です。

Iphone 開発用に OpenGL ES 2.0 でキューブを作成しました。

私の Shader.vsh は次のようになります。

attribute vec4 normal;
attribute vec4 position;

varying vec4 colorVarying;

uniform mat4 mvp_matrix;

void main()
{
    //Trasform the vertex
    gl_Position = mvp_matrix * position;

    colorVarying = vec4(1.0, 1.0, 0.0, 0.0);
}

drawframe の属性値を更新する部分は次のようになります。

// Update attribute values.
glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, 0, 0, cubeVerticesStrip);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, 0, 0, cubeNormalsStrip);
glEnableVertexAttribArray(ATTRIB_NORMAL);

そして、LoadShader 関数でこれらをバインドする部分は次のようになります。

glBindAttribLocation(program, ATTRIB_VERTEX, "position");
glBindAttribLocation(program, ATTRIB_NORMAL, "normal");

繰り返しますが、位置は機能します。しかし、「普通」は見つかりません。何か案は?

4

1 に答える 1

13

normalあなたの GLSL コンパイラがスマートだったので、 は見つかりませんでした。で実際に何かをしていないことがわかったのでnormalリソースを節約するために存在しないふりをします。

vec3また、 3 つの値しか渡さないため、法線と位置は 's である必要があります。これは厳密には必須ではありませんが、入力と属性を一致させることをお勧めします。

于 2011-08-26T10:32:56.743 に答える