OpenGL纹理融合与翻译

OpenGL纹理融合与翻译,opengl,texture-mapping,blending,Opengl,Texture Mapping,Blending,我有两个纹理映射到一个表面,一个是棋盘格(地板上的图案),另一个是光照贴图,两者都很好地混合和呈现。我遇到的问题是在混合之前转换光照贴图纹理。我需要这样做,这样我才能模拟手电筒在地板上的扫描 代码: 我试着把这六行代码放在**中的几个地方,我想也许OpenGL状态机在某些特定的地方需要它,但似乎没有什么能给我想要的效果 以前有人这样做过吗?我在我的OpenGL书籍或在线上都找不到任何关于翻译和混合纹理的信息。我可能找错东西了,但我已经两天没碰墙了。任何帮助都会很棒 感谢完整性,问题是纹理坐标落在

我有两个纹理映射到一个表面,一个是棋盘格(地板上的图案),另一个是光照贴图,两者都很好地混合和呈现。我遇到的问题是在混合之前转换光照贴图纹理。我需要这样做,这样我才能模拟手电筒在地板上的扫描

代码:

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

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


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

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

你在x&y方向上平移了5个单位……但是纹理坐标在[0,1]间隔内——这可能是问题所在吗?天哪,你说得对!真管用!非常感谢你。这是有道理的,翻译到5会把它放回原来的位置。回答我的问题,这样我就可以把它标记为正确答案你在x&y方向上翻译了5个单位…但是纹理坐标在[0,1]间隔内--这可能是问题所在吗?天哪,你说得对!真管用!非常感谢你。这是有道理的,翻译到5会把它放回原来的位置。回答我的问题,这样我就可以把它标记为正确答案
    //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();