一般的な頂点属性は OpenGL で非推奨になっているため、カスタム属性のみを使用して頂点シェーダーを書き直そうとしました。そして、私は私のために働きませんでした。頂点シェーダーは次のとおりです。
attribute vec3 aPosition;
attribute vec3 aNormal;
varying vec4 vColor;
vec4 calculateLight(vec4 normal) {
// ...
}
void main(void) {
gl_Position = uProjectionMatrix * uWorldViewMatrix * vec4(aPosition, 1);
vec4 rotatedNormal = normalize(uWorldViewMatrix * vec4(aNormal, 0));
vColor = calculateLight(rotatedNormal);
}
これは OpenGL ES 2.0 で完全に機能します。ただし、OpenGL で使用しようとすると、黒い画面が表示されます。aNormal
ジェネリックに変更すると、gl_Normal
すべて正常に動作します (aPosition
両方のコンテキストで正常に動作し、使用する必要がないことに注意してくださいgl_Vertex
)。
私は何を間違っていますか?
RenderMonkey を使用してシェーダーをテストし、適切な属性名 (aPosition および aNormal) を使用してストリーム マッピングをセットアップしました。多分それは属性インデックスと関係があります。なぜなら、私はそれらすべてを0
? また、「ストリーム マッピング」でのカスタム属性名の設定について、RenderMonkey のドキュメントには次のように記載されています。
「属性名」フィールドには、シェーダ エディタでそのストリームを参照するために使用できるデフォルト名が表示されます。OpenGL ES エフェクトでは、変更された名前を使用してストリームを参照する必要があります。ただし、DirectX または OpenGL 効果では、新しい名前はシェーダー エディターに影響しません。
この問題は RenderMonkey または OpenGL 自体に固有のものなのでしょうか? そして、なぜaPosition
まだ機能するのですか?