2015-04-02 62 views
1

我试图呈现一个以上的质感在Windows下的远程桌面后备缓冲的部分(这是使用GDI使用OpenGL 1.1)。渲染多重纹理部分后备缓冲(单结合,GDI)

为了简单起见,我将使用两个纹理的例子。
屏幕分辨率:1070x700
最大纹理尺寸:1024
NPOT:不支持

有了这个信息,我创建了两个纹理使用解析度:1024×1024(!也必须是方形)和渲染画面的两个部分这些是这样的:

第一特克斯:X:0-> 1023,Y:0-> 699
第二特克斯:X:1024-> 1070,Y:0-> 699

当然,每个纹理的剩余表面包含垃圾,但我不在乎,因为当我复制吨我正在设置vertexCoords只包含“正确”的数据。我很确定,纹理的创建及其渲染是正确的,因为在尝试渲染它们到缓冲区之前,我将它们作为png图像导出到硬盘上,并且它们很好(当然它们在区域中包含垃圾已经提到)。

现在,当我试图使它们回到后备缓冲,我这样做:

“texs”是保存每个纹理造就了其ID和屏幕的矩形结构的阵列从哪里复制像素(以像素为单位)。

对于每一个纹理创建我设置以下参数:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

正如你所看到的,不重复设置。

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 

glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 
glOrtho(0, GL->width(), 0, GL->height()); // in order to re-use my saved coordinates values which are set in pixels 

glDisable(GL_LIGHTING); 
glColor3f(1., 1., 1.); 
glEnable(GL_TEXTURE_2D); 

glDrawBuffer(GL_BACK); 

for (GLuint i=0; i < texs.size(); ++i) { 
    glBindTexture(GL_TEXTURE_2D, texs[i]); 

    glBegin(GL_QUADS); 

    /* Bottom Left */ 
    glTexCoord2f(0., 0.); 
    glVertex2i(texs[i].x(), texs[i].y()); 

    /* Top Left */ 
    glTexCoord2f(0., texs[i].height()/(float)1024); // 1024 -> texture size 
    glVertex2i(texs[i].x(), texs[i].y() + texs[i].height()); 

    /* Top Right */ 
    glTexCoord2f(texs[i].width()/(float)1024, texs[i].height()/(float)1024); 
    glVertex2i(texs[i].x() + texs[i].width(), texs[i].y() + texs[i].height()); 

    /* Bottom Right */ 
    glTexCoord2f(texs[i].width()/(float)1024, 0.); 
    glVertex2i(texs[i].x() + texs[i].width(), texs[i].y()); 

    glEnd() 
} 

/* Restore values */ 

/* Call swap buffers */ 

现在,结果我得到的是第一纹理正确渲染,但在第二质地应出现在屏幕的区域,再次出现第一个质感!我的意思是,在我的例子中,在屏幕的矩形(矩形设置为x1,y1,x2,y2):(0,0,103,699)我得到第一个纹理,其余的是:(1024, 0,1069,699)我再次看到第一个,就好像没有纹理循环发生!

出于测试目的,在for循环我绕过第一纹理和试图呈现仅第二使用X,所述第一y坐标(用于当然宽度和高度分别为从第二)。它正确渲染。

那是可能的,在OpenGL 1.1,你不能呈现一个以上的质感?这并不是说我试图将它们结合到第三个纹理或其他东西!

PS:我不想第一纹理复制到另一个缓冲区,因为它是缓慢的。这是我为了保存PNG而仅用于测试目的。

回答

0

在循环中的每一步结束时,如果我第一次解除绑定纹理(即调用glBindTexture(GL_TEXTURE_2D,0)),然后绑定新的工作正常,即使文档指出当调用绑定到另一个纹理,以前的绑定是打破的!

不知道为什么,这是在远程桌面发生。在本地运行时不需要。