首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glTexImage2D多个镜像

glTexImage2D多个镜像
EN

Stack Overflow用户
提问于 2011-02-01 02:29:31
回答 2查看 9.8K关注 0票数 4

我正在从openCV全屏绘制一个图像,这是一个60fps的大图像,所以我需要一个比openCV图形用户界面更快的方法。

使用OpenGL我做到了:

代码语言:javascript
复制
void paintGL() {
    glClear (GL_COLOR_BUFFER_BIT);
    glClearColor (0.0,0.0,0.0,1.0);

    glDisable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,width,height,0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glEnable(GL_TEXTURE_2D);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data );
    glBegin(GL_QUADS);
    glTexCoord2i(0,0); glVertex2i(0,height);
    glTexCoord2i(0,1); glVertex2i(0,0);
    glTexCoord2i(1,1); glVertex2i(width,0);
    glTexCoord2i(1,0); glVertex2i(width,height);
    glEnd();
    glDisable(GL_TEXTURE_2D);
}

现在我想画两个图像:侧面-使用openGL硬件来缩放它们。

我可以通过更改四边形大小来缩小图像,我不知道如何使用glTexImage2()加载两个图像,因为没有与图像关联的句柄或id。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-01 02:53:33

您看不到如何添加另一个纹理的原因是因为您发布的代码中缺少两个关键函数:glGenTexturesglBindTexture。第一个将在OpenGL上下文中生成纹理对象(纹理在图形硬件上存在的位置)。第二个“选择”这些纹理对象中的一个用于后续调用(glTex..)去影响它。

首先,像glTexParameteri和glTexImage2D这样的函数不需要在每个渲染循环中再次调用...但我想在您的情况下,您应该这样做,因为图像总是在变化。默认情况下,在您的代码中,使用的纹理对象是第零个对象(为默认保留的对象)。您应该创建两个纹理对象并将它们一个接一个地绑定,以获得所需的结果:

代码语言:javascript
复制
GLuint tex_obj[2]; //create two names for the texture (should not be global variables, but just for sake of this example).

void initGL() {
    glClearColor (0.0,0.0,0.0,1.0);

    glDisable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,width,height,0);

    glEnable(GL_TEXTURE_2D);
    glGenTextures(2,tex_obj); //generate 2 texture objects with names tex_obj[0] and [1]

    glBindTexture(GL_TEXTURE_2D, tex_obj[0]); //bind the first texture
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}

void paintGL() {
    glClear (GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glBindTexture(GL_TEXTURE_2D,tex_obj[0]); //bind the first texture.
    //then load it into the graphics hardware:
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width0, height0, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data0 );
    glBegin(GL_QUADS);
    glTexCoord2i(0,0); glVertex2i(0,height);  //you should probably change these vertices.
    glTexCoord2i(0,1); glVertex2i(0,0);
    glTexCoord2i(1,1); glVertex2i(width,0);
    glTexCoord2i(1,0); glVertex2i(width,height);
    glEnd();

    glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture.
    //then load it into the graphics hardware:
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width1, height1, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data1 );
    glBegin(GL_QUADS);
    glTexCoord2i(0,0); glVertex2i(0,height);  //you should probably change these vertices.
    glTexCoord2i(0,1); glVertex2i(0,0);
    glTexCoord2i(1,1); glVertex2i(width,0);
    glTexCoord2i(1,0); glVertex2i(width,height);
    glEnd();
}

这基本上就是这样做的。但我必须警告你,我对OpenGL的了解有点过时了,所以可能有更有效的方法来做到这一点(至少我知道在C++中不推荐使用glBegin/glEnd,取而代之的是VBO)。

票数 11
EN

Stack Overflow用户

发布于 2011-02-02 00:35:12

记住,openGL是一个状态机--你把它放入一个状态,给它一个命令,然后它会在稍后重播这些状态。

纹理的一个好处是你可以在画图调用之外做一些事情-所以如果在你的图像处理步骤中你生成了图像1,你可以在那个时候把它加载到卡片中。

代码语言:javascript
复制
glBindTexture(GL_TEXTURE_2D,tex_obj[1]);  // select image 1 slot
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width1, height1, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data1 ); // load it into the graphics card memory

然后在paint调用中调用它

代码语言:javascript
复制
glBindTexture(GL_TEXTURE_2D,tex_obj[1]); // select pre loaded image 1
glBegin(GL_QUADS); // draw it
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4854584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档