gpt4 book ai didi

qt - 需要帮助使用 Qt5 Qml + OpenGL 进行简单渲染

转载 作者:行者123 更新时间:2023-12-04 13:34:45 27 4
gpt4 key购买 nike

我需要让我的 Qml View 的一部分被一些非 Qt OpenGL 渲染“接管”,并且我在让纹理正确显示时遇到问题,所以我想我只需画一条线并让它在之前工作转到更复杂的代码。

对于那些不熟悉 Qt5 的人,整个窗口都是使用 OpenGL 绘制的,我正在使用 QQuickWindow::beforeRendering() 信号连接到 Qt 的 OpenGL 绘制机制,这意味着每次重绘(每次垂直同步)都会执行我的绘制代码。

我采用了 Squircle 示例代码 ( http://qt-project.org/doc/qt-5/qtquick-scenegraph-openglunderqml-example.html ) 并稍微修改了它,以便它可以在屏幕的指定部分(而不是整个屏幕)中进行绘制,并且效果很好。然后,我只修改了 renderer::paint() 函数以最初绘制三条绿线,并在 2 秒后改为绘制一条蓝线:

void CtRenderer::paint()
{
static int n = 0;

if (n == 0)
{
glViewport(m_rect.x() + 10, m_rect.y() + 10, m_rect.width() - 20, m_rect.height() - 20);

glEnable(GL_SCISSOR_TEST);
glScissor(m_rect.x() + 10, m_rect.y() + 10, m_rect.width() - 20, m_rect.height() - 20);

glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);

// glClearColor(1, 0, 0, 1);
// glClear(GL_COLOR_BUFFER_BIT);

glLineWidth(10);
glColor4f(0.0, 1.0, 0.0, 1);
glBegin(GL_LINES);
glVertex3f(0.0, 0.0, 1); glVertex3f(1, 0.5, 1);
glVertex3f(0.0, 0.0, 1); glVertex3f(0.5, 0.5, 1);
glVertex3f(0.0, 0.0, 1); glVertex3f(0.5, 1, 1);
glEnd();
}
else if (n == 120)
{
glViewport(m_rect.x() + 10, m_rect.y() + 10, m_rect.width() - 20, m_rect.height() - 20);

glEnable(GL_SCISSOR_TEST);
glScissor(m_rect.x() + 10, m_rect.y() + 10, m_rect.width() - 20, m_rect.height() - 20);

glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);

// glClearColor(1, 0, 0, 1);
// glClear(GL_COLOR_BUFFER_BIT);

glLineWidth(10);
glColor4f(0.0, 0.0, 1.0, 1);
glBegin(GL_LINES);
glVertex3f(0.0, 0.0, 1); glVertex3f(0.4, 0.8, 1);
glEnd();

}
n++;

return;

}`

我得到的是连续闪烁的三条灰色线,并且永远不会变成一条线。经过一些在线研究,我认为也许我不应该使用 glBegin()/glEnd() 所以我更改了代码:
void CtRenderer::paint()
{
static bool bOnce = true;

if (bOnce)
{
glViewport(m_rect.x() + 10, m_rect.y() + 10, m_rect.width() - 20, m_rect.height() - 20);

glEnable(GL_SCISSOR_TEST);
glScissor(m_rect.x() + 10, m_rect.y() + 10, m_rect.width() - 20, m_rect.height() - 20);

float vertices[] = {-0.5f, -0.5f, 0.5f, 0.5f};

glLineWidth(10);
glColor4f(0.0, 1.0, 0.0, 1);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices);

glDrawArrays(GL_LINES, 0, 2);

glDisableClientState(GL_VERTEX_ARRAY);

bOnce = false;
}

return;
}

这仍然给我一条闪烁的灰线。

当我在一个简单的 GLUT 应用程序中尝试这段代码时,在 Qt 之外,它工作得很好,所以它似乎是 OpenGL 和 Qt5 Qml 之间的一些交互。我接下来可以尝试什么?

附言我在 Linux Ubuntu 机器上使用 Qt 5.3 版

pps为了回应一些评论,我更新了我的代码,如下所示:
void dumpGlErrors(int iLine)
{
for (;;)
{
GLenum err = glGetError();
if (err == GL_NO_ERROR)
return;
std::cout << "GL error " << err << " detected in line " << iLine << std::endl;
}
}

void CtRenderer::paint()
{
glPushMatrix();

glLoadIdentity();

glViewport(m_rect.x() + 10, m_rect.y() + 10, m_rect.width() - 20, m_rect.height() - 20);

glEnable(GL_SCISSOR_TEST);
glScissor(m_rect.x() + 10, m_rect.y() + 10, m_rect.width() - 20, m_rect.height() - 20);

dumpGlErrors(__LINE__);

glClearColor(1, 0, 1, 1); // Magenta
glClear(GL_COLOR_BUFFER_BIT);

bool bDepth = glIsEnabled(GL_DEPTH_TEST);
glDisable(GL_DEPTH_TEST);

bool bLighting = glIsEnabled(GL_LIGHTING);
glDisable(GL_LIGHTING);

bool bTexture = glIsEnabled(GL_TEXTURE_2D);
glDisable(GL_TEXTURE_2D);

dumpGlErrors(__LINE__);

float vertices[] = { -0.5f, -0.5f, 0.1f, 0.5f, 0.5f, 0.1f, 0.5f, 0.5f, 1.0f, 0.5f, -0.5f, 1.0f };
float colors[] = { 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f };

glLineWidth(10);
glColor4f(0.0, 0.0, 1.0, 1);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, 0, colors);

dumpGlErrors(__LINE__);

glDrawArrays(GL_LINES, 0, 4); // 4, not 2.

dumpGlErrors(__LINE__);

// glFlush();

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

if (bTexture)
glEnable(GL_TEXTURE_2D);

if (bLighting)
glEnable(GL_LIGHTING);

if (bDepth)
glEnable(GL_DEPTH_TEST);

glPopMatrix();

dumpGlErrors(__LINE__);

// In case somebody else calls glClear()
glClearColor(0, 1, 1, 1); // Cyan
}

现在我得到了一个漂亮的洋红色背景,我看到我的线条闪烁一次,然后它消失了,我只剩下洋红色。

p.p.p.s.我尝试使用 VBO 类型的函数:
class Point
{
public:
float m_vertex[3];
float m_color[4];
};

void SquircleRenderer::drawBuffer()
{
QOpenGLFunctions glFuncs(QOpenGLContext::currentContext());

if (!m_bBufInit)
{
std::cout << "SquircleRenderer::drawBuffer()" << std::endl;
// Adding these two lines doesn't change anything
/*
glFuncs.initializeOpenGLFunctions();
glFuncs.glUseProgram(0);
*/

// Create a new VBO
glFuncs.glGenBuffers(1, &m_buf);

// Make the new VBO active
glFuncs.glBindBuffer(GL_ARRAY_BUFFER, m_buf);

static const Point points[4] = {
{ { -0.5f, -0.5f, 0.1f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
{ { 0.5f, 0.5f, 0.1f }, { 1.0f, 0.0f, 0.0f, 1.0f } },
{ { 0.5f, 0.5f, 1.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } },
{ { 0.5f, -0.5f, 1.0f }, { 1.0f, 1.0f, 0.0f, 1.0f } }
};

// Upload vertex data to the video device
glFuncs.glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Point), points, GL_STATIC_DRAW);

dumpGlErrors(__LINE__);

m_bBufInit = true;
}

glPushMatrix();

glLoadIdentity();

glViewport(m_rect.x() + 10, m_rect.y() + 10, m_rect.width() - 20, m_rect.height() - 20);

glEnable(GL_SCISSOR_TEST);
glScissor(m_rect.x() + 10, m_rect.y() + 10, m_rect.width() - 20, m_rect.height() - 20);

glClearColor(1, 1, 0, 1); // Yellow
glClear(GL_COLOR_BUFFER_BIT);

glFuncs.glBindBuffer(GL_ARRAY_BUFFER, m_buf);

dumpGlErrors(__LINE__);

/*
* "If a non-zero named buffer object is bound to the GL_ARRAY_BUFFER target
* (see glBindBuffer) while a vertex array is
* specified, pointer is treated as a byte offset into the buffer object's data store"
*/

glLineWidth(10);
glColor4f(0.0, 0.0, 1.0, 1);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Point), 0);

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, sizeof(Point), (void*)offsetof(Point, m_color));

dumpGlErrors(__LINE__);

glDrawArrays(GL_LINES, 0, 4); // 4, not 2.

dumpGlErrors(__LINE__);

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

// In case somebody else calls glClear()
glClearColor(0, 1, 1, 1); // Cyan

glPopMatrix();

dumpGlErrors(__LINE__);
}

和我所有的其他努力一样,我得到了一个黄色的背景,我的线条在线条消失之前出现了我认为是 1/60 秒的时间,我只有我的黄色背景。

最佳答案

我找到了答案:我必须告诉 Qt 我正在使用旧的固定函数管道。在进行任何绘图之前进行一次函数调用就可以解决问题:

QOpenGLFunctions glFuncs(QOpenGLContext::currentContext());
glFuncs.glUseProgram(0);

关于qt - 需要帮助使用 Qt5 Qml + OpenGL 进行简单渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24894693/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com