我试图呈现一个以上的质感在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而仅用于测试目的。