0

サーフェスにマッピングされた 2 つのテクスチャがあります。1 つはチェッカーボード (床のパターン) で、もう 1 つはライトマップです。どちらもうまくブレンドされ、表示されています。私が問題を抱えているのは、ブレンドの前にライトマップ テクスチャを変換することです。これを行う必要があるのは、床をスキ​​ャンする懐中電灯をシミュレートできるようにするためです....

コード:

    //Floor - Checkerboard
  float fF = 3.0; //Floor Factor

  //Checkerboard texture
  glActiveTexture(GL_TEXTURE0);
  glEnable(GL_TEXTURE_2D);
  glBindTexture(GL_TEXTURE_2D, textures[0]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);//turn on mipmapping
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  //Spotlight, modulate on checkerboard
  glActiveTexture(GL_TEXTURE1);
  glEnable(GL_TEXTURE_2D);
  glBindTexture(GL_TEXTURE_2D, textures[4]);
  **glPushMatrix();
    glMatrixMode(GL_TEXTURE);
    glLoadIdentity();
    glTranslatef(5.0, 5.0, 0.0);
    glMatrixMode(GL_MODELVIEW);
  glPopMatrix();**
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);

  float vals[4] = {0.0, 0.0, 0.0, 0.5};

  glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, vals);
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
  glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); 
  glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
  glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
  glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
  glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
  glTexEnvf(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT);
  glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);

  float spot_x = 1;
  float spot_y = 1;

  glBegin(GL_QUADS); 
  glNormal3d(0, 1, 0);
  glMultiTexCoord2f(GL_TEXTURE0, 0.0, fF); 
  glMultiTexCoord2f(GL_TEXTURE1, 0.0, spot_y); 
  glVertex3fv(d);
  glMultiTexCoord2f(GL_TEXTURE0, fF, fF); 
  glMultiTexCoord2f(GL_TEXTURE1, spot_x, spot_y); 
  glVertex3fv(c);
  glMultiTexCoord2f(GL_TEXTURE0, fF, 0.0); 
  glMultiTexCoord2f(GL_TEXTURE1, spot_x, 0.0); 
  glVertex3fv(e);
  glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0); 
  glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0); 
  glVertex3fv(g);

  glEnd();

** 内の 6 行のコードをいくつかの場所に配置しようとしましたが、OpenGL ステート マシンが特定の場所でそれを必要としている可能性があると考えましたが、私が望む効果が得られないようです。

誰もこれを以前にやったことがありますか?私の OpenGL ブックでも、オンラインでも、テクスチャの翻訳とブレンディングに関する情報が見つかりません。間違ったものを探しているのかもしれませんが、ここ 2 日間壁に頭をぶつけています。どんな助けでも素晴らしいでしょう。

ありがとう

4

1 に答える 1

3

完全を期すために、問題はテクスチャ座標が [0,1] 間隔に収まることであり、整数値で変換していたため、まったく変換されていないように見えました。

于 2011-02-06T22:12:27.027 に答える