2

以下に示すように、エラーは非常に奇妙です。iPad プログラムで OpenGLES 2.0 とシェーダーを使用していますが、コードまたはプロジェクトの構成に問題があるようです。モデルは無彩色(黒色)で描かれています。

2012-12-01 14:21:56.707 medicare[6414:14303] プログラム リンク ログ:
警告: BindAttributeLocation 要求に一致する頂点シェーダー属性 'color' が見つかりませんでした。
警告: 頂点シェーダー 'colorVarying' の出力がフラグメント シェーダーによって読み取られません
[プロセス 6414 スレッド 0x1ad0f に切り替えます]

そして、私はglBindAttibLocation次のような位置と通常のデータを渡すために使用します:

// This needs to be done prior to linking.
glBindAttribLocation(_program, INDEX_POSITION, "position");
glBindAttribLocation(_program, INDEX_NORMAL, "normal");

glBindAttribLocation(_program, INDEX_COLOR, "color"); //pass color to shader

私のプロジェクトには 2 つのシェーダーがあります。この奇妙なエラーに対する良い解決策はありますか? どうもありがとう!

私の頂点シェーダー:

uniform mat4 modelViewProjectionMatrix;
uniform mat3 normalMatrix;

attribute vec4 position;
attribute vec3 normal;
attribute vec4 color;

varying lowp vec4 DestinationColor;
void main()
{
    //vec4 a_Color = vec4(0.9, 0.4, 0.4, 1.0);
    vec4 a_Color = color;
    vec3 u_LightPos = vec3(1.0, 1.0, 2.0);

    float distance = 2.4;
    vec3 eyeNormal=normalize(normalMatrix * normal);

    float diffuse = max(dot(eyeNormal, u_LightPos), 0.0); // remove approx ambient light
    diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));
    DestinationColor = a_Color * diffuse; // average between ambient and diffuse   a_Color * (diffuse + 0.3)/2.0;

    gl_Position = modelViewProjectionMatrix * position;
}

そして、私のフラグメントシェーダーは次のとおりです。

varying lowp vec4 DestinationColor;

void main()
{
  gl_FragColor = DestinationColor;
}

とてもシンプルです。どうもありがとう!

4

1 に答える 1

2

ここにはいくつか問題があると思います。まず、属性の使用が正しくない可能性があります。属性は、頂点ごとに変化する要素のようなものです。データ構造の要素として色がありますか? そうしないと、シェーダーが正しく機能しません。

そして、 glBindAttibLocation を使用して、位置と通常のデータを次のように渡します。

いいえ、あなたはしません。glBindAttribLocation 「汎用頂点属性インデックスを名前付き属性変数に関連付けます」. データを渡しません。インデックス (glint) を変数に関連付けます。後で次のものを渡します: glVertexAttribPointer.

私はバインドも使用しません..私はこの方法でそれを行います-属性を設定します:

glAttributes[PROGNAME][A_vec3_vertexPosition] = glGetAttribLocation(glPrograms[PROGNAME],   "a_vertexPosition");
glEnableVertexAttribArray(glAttributes[PROGNAME][A_vec3_vertexPosition]);

その後、 glDrawElemetns を呼び出す前に、データを取得できるようにポインターを渡します。

glVertexAttribPointer(glAttributes[PROGNAME][A_vec3_vertexPosition], 3, GL_FLOAT, GL_FALSE, stride, (void *) 0);

ここでは、glAttributes という int の 2 次元配列を使用して、すべての属性インデックスを保持しています。しかし、あなたは今のように輝きを使うことができます.

エラーメッセージは、何が問題なのかを示しています。頂点シェーダーで次のように言います。

attribute vec4 color;

しかし、その下には a_Color もあります。

DestinationColor = a_Color * diffuse;

変数名と一貫性を持たせてください。私は今、変数の種類を明確に保つために、すべての変数の前に a_ v_ と u_ を置きました。あなたが a_ と呼んでいるものは、実際にはさまざまです。

また、エラーのため、投稿したシェーダーとコードの同じバージョンからのエラー メッセージではなかったと思われます。

WARNING: Output of vertex shader 'colorVarying' not read by fragment shader

また、colorVarying に関するエラーは、このバージョンの頂点シェーダーにさえない場合、混乱を招きます。シェーダーの現在のバージョンとそれらから得られるエラー メッセージを再投稿すると、サポートが容易になります。

于 2013-03-14T03:37:30.140 に答える