【发布时间】:2017-03-09 12:17:01
【问题描述】:
我正在使用 Qt 中的查看器来显示顶部带有线条或文本的图像。 我在几层上组织了图像、线条和文本,每一层都是一个 GL_QUADS。 如果我在 z 中堆叠图像,然后用线条在顶部绘制一个图层,则一切都按预期工作。 但我想在其他几个图层上绘制更多线条在与第一行图层相同的 z 上,这就是结果: lines layers conflict.
我不明白为什么每个线条层都会擦除先前重叠的线条层(但不会破坏底层图像)。 此外,如果我 在与线层相同的 z 处绘制另一层,但带有一些文本,结果如下: text layer issue.
文本层在所有底层图层中创建一个洞,您可以看到背景。
使用 QPainter 在 QImage 上以这种方式绘制线条和文本:
m_img = new QImage(&m_buffer[0], width, height, QImage::Format_RGBA8888);
m_img->fill(Qt::transparent);
QPen pen(color);
pen.setWidth(2);
m_painter.begin(m_img);
m_painter.setRenderHints(QPainter::Antialiasing, true);
m_painter.setPen(pen);
m_painter.drawLines(lines);
m_painter.end();
QFont font;
int font_size = font.pointSize() * scale;
if (font_size > 0) { font.setPointSize(font_size); }
QPen pen(color);
m_painter.begin(m_img);
m_painter.setRenderHints(QPainter::Antialiasing, true);
m_painter.setFont(font);
m_painter.setPen(pen);
for(int index = 0; index < messages.size(); index++)
m_painter.drawText(positions.at(index), messages.at(index));
m_painter.end();
和纹理:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, d->width(), d->height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, d->data());
这是我的纹理设置():
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST/*GL_LINEAR*/);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST/*GL_LINEAR*/);
opengl_error_check(__FILE__, __LINE__);
这是我的初始化GL():
glClearColor(0.0, 0.25, 0.5, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_MULTISAMPLE);
glEnable(GL_DEPTH_TEST);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel(GL_FLAT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
最后我在我的 QGLWidget 中设置了 QGLFormat(QGL::AlphaChannel)。
我知道在同一 z 上使用重叠平面存在 z-fighting 问题,但据我所知,只有当重叠纹理不透明时才有意义。在我的情况下,可能会在线条交叉的地方出现一些伪影,但我不明白为什么线条会消失。 而且由于我使用相同的方式来绘制线条和文本,我不明白为什么文本层会影响图像而线条不会。
最后一点:我在 glTexImage2D() 之前打印了所有纹理中的像素值,并且值符合预期。
我很确定有一些明显的错误,有人能指出我错在哪里吗?
【问题讨论】:
-
还有其他建议吗?我尝试了几种混合选项,但没有奏效。此外,在绘画过程中排序对象忽略深度不是我的应用程序的选项...