首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt OpenGL编程平台依赖关系

Qt OpenGL编程平台依赖关系
EN

Stack Overflow用户
提问于 2014-02-04 17:51:10
回答 2查看 450关注 0票数 2

关于Qt OpenGL编程的依赖关系或需求,我有一些问题。我使用Qt OpenGL 5.1和OpenGL与MSVC 2012 x64

  1. 我的第一个问题是在运行时选择和使用正确的图形设备适配器。我的个人电脑有两个图形设备,其中一个是星载英特尔,另一个是先进的NVidia GeForce GT740M。我可以使用我的高级显卡使用NVidia控制面板来激活Geforce始终。但我知道我必须做我的软件。怎样才能用Qt OpenGL来实现呢?
  2. 我的第二个问题是关于OpenGl扩展。我使用的是基本的OpenGL函数,但我的软件只在高级显卡上工作,它至少支持OpenGl 4.0。我在下面使用这些OpenGL扩展。

着色器

顶点着色器

代码语言:javascript
复制
uniform mat4 u_mat4_model;
uniform mat4 u_mat4_view;
uniform mat4 u_mat4_proj;

varying vec3 N;
varying vec3 v;

void main()
{
    mat4 model_view = u_mat4_view * u_mat4_model;
    mat4 model_view_proj = u_mat4_proj * model_view;

    v = model_view * gl_Vertex;
    N = normalize(gl_NormalMatrix * gl_Normal);

    gl_Position = model_view_proj * gl_Vertex;
}

碎片着色器

代码语言:javascript
复制
varying vec3 N;
varying vec3 v;

void main (void)
{
    vec3 L = normalize(gl_LightSource[0].position.xyz - v);
    vec3 E = normalize(-v);
    vec3 R = normalize(-reflect(L,N));

    vec4 Iambi = gl_FrontLightProduct[0].ambient;
    vec4 Idiff = gl_FrontLightProduct[0].diffuse * max(dot(N,L), 0.0);
    vec4 Ispec = gl_FrontLightProduct[0].specular * pow(max(dot(R,E),0.0), gl_FrontMaterial.shininess);

    gl_FragColor = gl_FrontLightModelProduct.sceneColor + Iambi + Idiff + Ispec;
}

画图

代码语言:javascript
复制
void Renderer::Render(Mesh *mesh, Material *material, RenderMode rm)
{
    material->Bind();

    if (mesh->GetVertexCount() > 0)
    {
        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer(3, GL_FLOAT, 0, mesh->GetVertices().constData());
    }
    else
    {
        return;
    }

    if (mesh->GetColorCount() > 0)
    {
        glEnableClientState(GL_COLOR_ARRAY);
        glColorPointer(3, GL_FLOAT, 0, mesh->GetColors().constData());
    }

    if (mesh->GetNormalCount() > 0)
    {
        glEnableClientState(GL_NORMAL_ARRAY);
        glNormalPointer(GL_FLOAT, 0, mesh->GetNormals().constData());
    }

    if (m_rm.Dotted() && rm.Dotted())
    {
        glDrawArrays(GL_POINTS, 0, mesh->GetVertexCount());
    }

    if (m_rm.Wired() && rm.Wired())
    {
        glDrawElements(GL_LINES, mesh->GetLineCount(), GL_UNSIGNED_INT, mesh->GetLines().constData());
    }


    if (m_rm.Solid() && rm.Solid())
    {
        glDrawElements(GL_TRIANGLES, mesh->GetFaceCount(), GL_UNSIGNED_INT, mesh->GetFaces().constData());
    }

    material->Unbind();
}

材料

代码语言:javascript
复制
void Material::Bind()
{
    glEnable(GL_COLOR_MATERIAL);

    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,   m_ambient);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,   m_diffuse);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,  m_specular);
    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION,  m_emission);
    glMateriali(GL_FRONT_AND_BACK,  GL_SHININESS, m_shininess);
}

void Material::Unbind()
{
    glDisable(GL_COLOR_MATERIAL);
}

代码语言:javascript
复制
void Light::Bind()
{
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    // Işık Pozisyon ve Yönünü Transformation sınıfından al
    QVector3D pos_v = m_transform.GetPosition();
    QVector3D dir_v = m_transform.GetDirection();

    float l_position[] = { pos_v.x(), pos_v.y(), pos_v.z()};
    float l_direction[] = { dir_v.x(), dir_v.y(), dir_v.z()};

    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,     m_lm_ambient);
    glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0);
    glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,     0.0);

    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, l_direction);
    glLighti(GL_LIGHT0,  GL_SPOT_EXPONENT,  m_spot_exponent);
    glLighti(GL_LIGHT0,  GL_SPOT_CUTOFF,    m_spot_cut_off);

    glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION,  m_constant);
    glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION,    m_lineer);
    glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, m_quadratic);

    glLightfv(GL_LIGHT0, GL_POSITION, l_position);
    glLightfv(GL_LIGHT0, GL_AMBIENT,  m_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  m_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, m_specular);
}

void Light::Unbind()
{
    glDisable(GL_LIGHTING);
    glDisable(GL_LIGHT0);
}
EN

回答 2

Stack Overflow用户

发布于 2014-02-04 18:06:38

  1. Qt中没有这样的功能,而且可能永远也不会--您不能在一个程序中使用一个图形卡,而对于第二个程序,您不能使用另一个图形卡,所以您需要对其进行全局更改。
  2. 制服从4.3起就处于核心的OpenGL中,从3.3开始作为arb扩展,这意味着您至少需要该版本的opengl才能使用它们。
票数 1
EN

Stack Overflow用户

发布于 2014-02-04 18:14:00

1)这很棘手,您需要(在Windows环境中)为您的设备创建一个DC (http://msdn.microsoft.com/en-us/library/windows/desktop/dd183490(v=vs.85).aspx,然后使用Windows,从HDC获取HWND )。

代码语言:javascript
复制
HWND handle = WindowFromDC(hdc);
assert(handle != NULL);

然后,子类QWidget获得对受保护成员的访问转换。使用此方法,使用此成员创建QWidget,如本解决方案中所述:如何创建以hwnd为父级的qwidget。在本例中,我调用了QWidgetWrapper的子类。

代码语言:javascript
复制
QWidgetWrapper *w = new QWidgetWrapper();
w->create((Wld)main_window);

请注意,Wld是Qt中用于“平台相关窗口标识符”的typedef。(资料来源:https://stackoverflow.com/a/10376968/1938163)

然后,您可以最终创建一个与它关联的QGLContext。

2)对于您的代码,我认为您至少需要OpenGL 4.3,您可以使用http://qt-project.org/doc/qt-4.8/qglformat.html#OpenGLVersionFlag-enum检查此代码

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21559746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档