2012-04-04 178 views
0

我有一个将RGB视频帧渲染到窗口的功能。这为拍摄尺寸(640×480),如果窗口是相同的尺寸,但是当我调整窗口大小的渲染是不正确的正常工作:将OpenGL纹理拉伸到窗口尺寸

img http://img855.imageshack.us/img855/1694/screenshot20120404at536.png

编辑:现在的工作职能。

static inline void draw_rgb(
    unsigned char * buf, unsigned x, unsigned y, unsigned window_width, 
    unsigned window_height, unsigned frame_width, unsigned frame_height 
) 
{ 
    glEnable(GL_TEXTURE_RECTANGLE_EXT); 
    glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 1); 

    glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, window_width * window_height * 2, buf); 

    glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, frame_width, frame_height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buf); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_TEXTURE_2D); 

    glViewport(x, y, window_width, window_height); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glOrtho((GLfloat)0, (GLfloat)window_width, (GLfloat)0, (GLfloat)window_height, -1.0, 1.0); 

    glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 1); 

    glMatrixMode(GL_TEXTURE); 
    glLoadIdentity(); 

    glBegin(GL_QUADS); 
    { 
     glTexCoord2f(0.0f, 0.0f); 
     glVertex2f(0.0f, window_height); 
     glTexCoord2f(0.0f, frame_height); 
     glVertex2f(0.0f, 0.0f); 
     glTexCoord2f(frame_width, frame_height); 
     glVertex2f(window_width, 0.0f); 
     glTexCoord2f(frame_width, 0.0f); 
     glVertex2f(window_width, window_height); 
    } 
    glEnd(); 
} 
+3

什么是'不正确'? – Tim 2012-04-04 21:46:26

+0

为什么在'ARB_texture_non_power_of_two'上选择'EXT_texture_rectangle' /'ARB_texture_rectangle'?如这里所示 – genpfault 2012-04-04 21:52:32

+0

的图像变得失真:[链接](http://img855.imageshack.us/img855/1694/screenshot20120404at536.png) – junglecat 2012-04-04 21:53:38

回答

2

你的问题是两个因素的结合。

首先,datenwolf指出的那样,你的纹理的宽度/高度是恒定的。窗口大小不会改变。顺便说一句,除非纹理的数据改变,否则你不应该在每一帧都重建纹理。即使如此,您也可以上传更改glTexSubImage2D而不是glTexImage。你不需要拨打glTexParameter的东西。

其次,这也意味着你纹理坐标不会改变。所以你需要改变你的四画图:

glBegin(GL_QUADS); 
{ 
    glTexCoord2f(0.0f, 0.0f); 
    glVertex2f(0.0f, window_height); 
    glTexCoord2f(0.0f, texture_height); 
    glVertex2f(0.0f, 0.0f); 
    glTexCoord2f(texture_width, texture_height); 
    glVertex2f(window_width, 0.0f); 
    glTexCoord2f(texture_width, 0.0f); 
    glVertex2f(window_width, window_height); 
} 
glEnd(); 
0

glViewport呼叫是使用相同的wh变量代表纹理其他地方的大小。

尝试更改glViewport以使用要渲染的窗口大小,而不是wh。其他一切应该能够保持不变。

为了获得更好的效果,你能适应视口大小决定维持影片的长宽比,通过减少视口的宽度或高度,使得视频不显得捉襟见肘。

+0

我已经更新了变量名称以便更有意义。 – junglecat 2012-04-04 22:30:19

+0

@junglecat:你有点错过了这一点。你的纹理与你的窗户尺寸不一样。如果是这样,那么你就不需要*伸展它。这就是你的腐败来自的地方:你的纹理的大小*固定*;窗户的大小发生了变化。 – 2012-04-05 00:37:52

3

主要的问题是在这里

glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, window_width, window_height, 0, 
     GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buf); 

glTexImage把你的纹理数据,而不是窗口的大小或所需的输出尺寸的大小。

+0

如果我给它的纹理数据的大小(640 x 480)渲染帧不再扭曲,而是剪裁到窗口大小。 – junglecat 2012-04-05 00:30:31

+0

@junglecat:嗯,你使用投影和纹理四边形的顶点位置来确定输出大小。调整这些。 – datenwolf 2012-04-05 07:46:41