0

我有一个将 RGB 视频帧呈现到窗口的功能。如果窗口尺寸相同,这对于捕获的尺寸(640 x 480)来说很好,但是当我调整窗口大小时,渲染不正确:

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();
}
4

3 回答 3

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 采用纹理数据的大小,而不是窗口大小或所需输出的大小。

于 2012-04-05T00:17:48.213 回答
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();
于 2012-04-05T00:40:16.487 回答
0

您的glViewport调用使用了相同的w变量h和表示其他地方纹理大小的变量。

尝试更改glViewport以使用您正在渲染的窗口的大小,而不是wand h。其他一切都应该能够保持不变。

为了获得更好的结果,您可以调整视口大小以保持视频的纵横比,方法是减小视口的宽度或高度,以使视频看起来不会被拉伸。

于 2012-04-04T21:55:39.843 回答