1

ある種の基本的な照明システムを作成しようとしています。私はこの構造体をセットアップしました:

struct Light
{
  vec3 position;
  vec4 diffuse;
  vec4 ambient;
  bool enabled;
};

そして、4 つの無効なライトを定義します。

uniform Light light0 = Light(vec3(0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), false);
uniform Light light1 = Light(vec3(0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), false);
uniform Light light2 = Light(vec3(0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), false);
uniform Light light3 = Light(vec3(0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), false);

私のプログラムでは、ライトを変更できるように均一な位置を取得しようとしているので、このコードを使用します。

int[][] lightLocs = new int[MAX_LIGHTS][4]; //Position, Diffuse, Ambient, Enabled
for(int i = 0; i < MAX_LIGHTS; i++) { //MAX_LIGHTS is set to 4
    lightLocs[i][0] = GL20.glGetUniformLocation(shaderProgram, "light"+i+".position");
    lightLocs[i][1] = GL20.glGetUniformLocation(shaderProgram, "light"+i+".diffuse");
    lightLocs[i][2] = GL20.glGetUniformLocation(shaderProgram, "light"+i+".ambient");
    lightLocs[i][3] = GL20.glGetUniformLocation(shaderProgram, "light"+i+".enabled");
    //Print locations just for bug testing
    for(int j = 0; j < 4; j++) {
        System.out.print(lightLocs[i][j] + ", ");
    }
    System.out.println();
}

しかし、私はいくつかの奇妙な結果を得ています。最初の 3 つのライト (0 ~ 2) の 4 つの場所すべてが -1 を返します。light3 の位置も -1 を返しますが、最後の 3 つの値は 4、5、および 6 を返します。4、5、および 6 は意味があります。なぜなら、頂点シェーダーのライトの前に 4 つのユニフォームが定義されているからです。他の場所で -1 を取得しますか? 私もこれを試しました:

uniform Light light0;
uniform Light light1;
uniform Light light2;
uniform Light light3;

それが機能するかどうかを確認しますが、ライトの残りの均一な位置は -1 として返されます。

4

1 に答える 1

2

シェーダー コードで使用されていないユニフォームは、最適化されることがよくあります。これらのユニフォームは「アクティブ」とは見なされないため、ロケーションは -1 です。

于 2013-01-08T22:27:40.617 に答える