我正在尝试将多个纹理的一部分渲染到Windows上的远程桌面下的后备缓冲区(这是使用带有opengl 1.1的GDI)。
为简单起见,我将使用两个纹理的示例
屏幕分辨率:1070x700
最大纹理尺寸:1024
NPOT:不支持
有了这些信息,我用res创建两个纹理:1024x1024(也必须是正方形!)并在这些上渲染屏幕的两个部分:
第1 Tex:x:0-> 1023,y:0-> 699
第二Tex: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);
如您所见,未设置REPEAT。
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,1023,699)我得到第一个纹理,其余的是:(1024, 0,1069,699)我再次看到第一个,好像没有发生纹理循环!
出于测试目的,在for-loop中我绕过了第一个纹理并试图仅使用x,y坐标获得第一个纹理(当然使用的宽度和高度来自第二个)。它正确呈现。
可能在opengl 1.1中你不能渲染多个纹理吗?这并不是说我想把它们组合成第三种纹理或什么东西!
ps:我不想先将纹理复制到另一个缓冲区,因为它很慢。这是我为了保存png而仅用于测试的目的。
答案 0 :(得分:0)
在循环中的每个步骤结束时,如果我首先取消绑定纹理(即调用glBindTexture(GL_TEXTURE_2D,0))然后绑定新的一个工作正常,即使文档声明当调用绑定到另一个纹理时,以前的绑定被破坏了!
不知道为什么在远程桌面上发生这种情况。在本地运行时,不需要这样做。