2010-09-16 78 views
0

我有两个纹理映射到一个表面,一个是棋盘格(地板上的图案),另一个是光照贴图,两者都混合并呈现得很好。我遇到的麻烦是在混合前将光照贴图纹理转换。我需要这样做,所以我可以模拟在地板上手电筒扫描....OpenGL纹理混合和转换

代码:

//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书籍中找到任何信息,也无法在网上找到有关翻译和混合纹理的信息。我可能正在寻找错误的东西,但我现在已经在墙上打了我两天的头。任何帮助都会很棒。

由于

+4

你是glTranslating()在x和y方向上的5单位...但纹理坐标是在[0,1]间隔 - 这可能是问题吗? – 2010-09-16 00:55:44

+0

圣克拉波拉你是对的!这样可行!非常感谢。这是有道理的,翻译5将把它放回到它开始的同一个地方。回答我的问题,以便我可以将其标记为正确答案 – jakev 2010-09-16 01:14:49

回答

3

为了完整起见,问题是,纹理在区间[0,1]的坐标秋天,我被整数值转换,因此它看来好像它未翻译的。