代码之家  ›  专栏  ›  技术社区  ›  jakeva

OpenGL纹理融合与翻译

  •  0
  • jakeva  · 技术社区  · 14 年前

    代码:

        //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();
    

    我试着把这六行代码放在**中的几个地方,我想也许OpenGL状态机在某些特定的地方需要它,但似乎没有什么能给我想要的效果。

    以前有人做过吗?我在我的OpenGL书籍或网上都找不到任何关于翻译和混合纹理的信息。我可能找错东西了,但我已经两天没碰过墙了。任何帮助都会很棒。

    谢谢

    1 回复  |  直到 14 年前
        1
  •  3
  •   jakeva    14 年前

    为了完整性,问题是纹理坐标落在[0,1]区间,而我是按整数值转换的,所以看起来好像根本就没有转换。