在纹理,OpenGL附近的边界

时间:2012-12-12 13:34:17

标签: c++ opengl graphics textures

这是我用来在程序中绘制矩形的代码:

glBegin(GL_QUADS);
    glTexCoord2f(0.0f, maxTexCoordHeight);              glVertex2i(pos.x, pos.y + height);
    glTexCoord2f(0.0f, 0.0f);                           glVertex2i(pos.x, pos.y);
    glTexCoord2f(maxTexCoordWidth, 0.0f);               glVertex2i(pos.x + width, pos.y);
    glTexCoord2f(maxTexCoordWidth, maxTexCoordHeight);  glVertex2i(pos.x + width, pos.y + height);
glEnd();

它只绘制一个具有指定纹理的简单矩形,例如像这样:enter image description here

我想问一下,在OpenGL中是否可以实现这样的边框效果:

正如你在这个瓷砖里看到的那样,只有一个纯蓝色背景可以单独处理 - 只是自动调整纹理大小。这可以通过我给出的代码片段轻松实现,但问题在于边框。

如果边框应该是一种颜色,我可以尝试在纹理周围使用GL_LINES绘制空的,未填充的矩形,但事实并非如此。

此外,如果瓷砖总是具有固定尺寸,我可以准备一个与之匹配的纹理,但是它们必须易于调整,而不会更改我用作纹理的位图文件。

因此,如果基本的OpenGL功能无法实现,那么实现这种效果最有效和/或最简单的方法是什么?

编辑:它必须是2D。

2 个答案:

答案 0 :(得分:5)

这是使用OpenGL的GUI的经典问题,通常使用9-cell模式解决。在此,您将效果添加到原始图像(或通过其他opengl参数定义),并将渲染的四边形拆分为九个四边形:三行三列。

然后,在固定左侧和右侧列的宽度时,固定上下行的高度。缩放中心四边形,使您的对象适合您想要适合的矩形。然后,只将纹理的边框部分映射到形成外部单元格的四边形,同时将纹理的中心映射到中心四边形。


与评论中的内容相关,您还可以通过制作四维3D来使用实际的3D效果。在这种情况下,没有人强迫你使用透视投影,你可以使用正交投影(2D模式)。无论如何,OpenGL总是会进行3D计算。

答案 1 :(得分:0)

除了乔纳斯的答案,这是非常好的,我想再增加两个选项 第一个是让纹理看起来像你想要的方块。如果你可以在photoshop中这样做,则不需要花哨的代码;) 第二个是使您的绘图代码稍微复杂化。如果你看一下你的图像,你可以看到每一个"边坡"您的方块可以用两个三角形绘制。您可以使代码绘制10个三角形而不是一个正方形,并为每组两个三角形使用不同的颜色:

draw() {
    GLFloat i = <your_inset_here>;

    //top border part, top left triangle
    glColor3f(<color_0>);
    glVertex2f(pos.x, pos.y);
    glVertex2f(pos.x + w, pos.y);
    glVertex2f(pos.x + i, pos.y + i);
    //top border part, bottom right triangle
    glVertex2f(pos.x + w, pos.y);
    glVertex2f(pos.x + w - i, pos.y + i);
    glVertex2f(pos.x + i, pos.y + i);

    //repeat this process with the other coordinates for the other three borders

    // draw the middle square using {(pos.x+i,pos.y+i),(pos.x+w-i,pos.y+i),(pos.x+w-i,pos.y+h-i),(pos.x+i,pos.y+h-i)} as coordinates
}

您可以通过创建一个函数来进一步改进这一点,该函数使用给定坐标和颜色绘制不规则形状的四边形并将该函数调用5次。