OpenGL调整纹理/四边形

Posted

技术标签:

【中文标题】OpenGL调整纹理/四边形【英文标题】:OpenGL resizing a Texture/Quad 【发布时间】:2012-03-16 14:06:48 【问题描述】:

我正在为 jpeg 实现一个平移/缩放查看器。我一次显示一个映射到纹理的图像,然后在按键时在图像之间切换。

我的问题是,虽然图像确实发生了变化,但四边形的大小固定为加载的第一个图像的宽度和高度,并且不会更新。这是绘制四边形等的代码:

请注意,ROI_WIDTH 和 ROI_HEIGHT 是全局变量,每次加载新图像时都会成功更新,但这不会反映在输出中:

void orthogonalStart (void) 
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluOrtho2D(0, ROI_WIDTH, 0, ROI_HEIGHT);
    glScalef(1, -1, 1);
    glTranslatef(0, -ROI_HEIGHT, 0);
    glMatrixMode(GL_MODELVIEW);


void orthogonalEnd (void) 
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);



void display (void) 
    glClearColor (1.0,1.0,1.0,0.0);
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    orthogonalStart();

    glEnable( GL_TEXTURE_2D );
    glEnable( GL_DEPTH_TEST );
    glDepthFunc(GL_LESS);

    glBindTexture( GL_TEXTURE_2D, texture );
    glRotatef(180.0, 250.0f, 250.0f, 0.0f);

    glBegin(GL_QUADS);
    glTexCoord2i(0,0); glVertex2f(0, 0);
    glTexCoord2i(1,0); glVertex2f(0, ROI_WIDTH);
    glTexCoord2i(1,1); glVertex2f(ROI_HEIGHT, ROI_WIDTH);
    glTexCoord2i(0,1); glVertex2f(ROI_HEIGHT, 0);
    glEnd();


    orthogonalEnd();
    zoomFac();
    glViewport (xView, yView, (GLsizei)(winx*zoomFactor), (GLsizei)(winy*zoomFactor));
    glutSwapBuffers();

【问题讨论】:

【参考方案1】:

您对gluOrtho2D() 的调用告诉 OpenGL,您的输出的宽度和高度始终为 ROI_WIDTH 乘以 ROI_HEIGHT 单位。所以你的四边形总是会覆盖整个输出区域。您可能应该将gluOrtho2D() 中的宽度和高度设置为输出区域(您的窗口、视图或屏幕,取决于您的设置方式)的像素宽度和高度。

【讨论】:

以上是关于OpenGL调整纹理/四边形的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL / LWJGL 绘制纹理四边形使用旧纹理

四边形上的 Opengl 纹理

绘制带纹理的四边形 OpenGL

OpenGL核心配置文件不会纹理四边形

透明四边形上的OpenGL DECAL纹理?

OpenGL - 四边形上的纹理坐标