2017-07-20 1 views
0

QtでVS2013からBox2Dのデモプロジェクトを移植したいと思います。しかし、私は1つの珍しい問題があります。 VSでデモプロジェクトを実行すると、自分のOpenGL設定に関する情報が入ったメッセージが表示されます。QtアプリケーションでGLSL 1.40を有効にする

enter image description here

私はQtの上のコードを交換し、シェーダとQOpeGLラッパーとのOpenGLつくの呼び出しの初期設定を変更しました。

はまず、私はこのようなデフォルトの表面の書式変更:

QSurfaceFormat format; 
format.setVersion(3, 1); 
format.setProfile(QSurfaceFormat::CoreProfile); 
QSurfaceFormat::setDefaultFormat(format); 

をしかし、私はプログラムが3.0に私の表面の滞在の形式でデバッグするとき。

QOpenGLShader::compile(Vertex): ERROR: 0:1: '140' : version number not supported 
ERROR: 0:2: 'layout' : syntax error 
*** Problematic Vertex shader source code *** 
#version 140 
#line 1 
uniform mat4 projectionMatrix; 
layout(location = 0) in vec2 v_position; 
layout(location = 1) in vec4 v_color; 
layout(location = 2) in float v_size; 
out vec4 f_color; 
void main(void) 
{ 
    f_color = v_color; 
    gl_Position = projectionMatrix * vec4(v_position, 0.0f, 1.0f); 
gl_PointSize = v_size; 
} 

はなぜVSがシェーダを作成およびOpenGL 3.1/GLSL 1.40で動作することができますが、Qtはない:私はシェーダを作成しようとすると

enter image description here

は、私は、このようなエラーメッセージが表示されますこれを行う?

GLの初期化(m_functions - QOpenGLExtraFunctions)

void MainOpenGLWidget::initializeGL() 
{ 
    makeCurrent(); 

    qDebug() << "OPENGL " << QSurfaceFormat::defaultFormat().majorVersion() << 
      "." << QSurfaceFormat::defaultFormat().minorVersion(); 

    m_functions.initializeOpenGLFunctions(); 
    m_functions.glClearColor(0, 0, 0, 0); 

    g_camera.m_width = 1024; 
    g_camera.m_height = 640; 

    g_debugDraw.Create(&m_functions); 
} 

が機能g_debugDraw.Create(...)

void Create(QOpenGLExtraFunctions *functions) 
{ 
    const char *vs = \ 
        "#version 140\n" 
        "uniform mat4 projectionMatrix;\n" 
        "layout(location = 0) in vec2 v_position;\n" 
        "layout(location = 1) in vec4 v_color;\n" 
        "layout(location = 2) in float v_size;\n" 
        "out vec4 f_color;\n" 
        "void main(void)\n" 
        "{\n" 
        " f_color = v_color;\n" 
        " gl_Position = projectionMatrix * vec4(v_position, 0.0f, 1.0f);\n" 
        " gl_PointSize = v_size;\n" 
        "}\n"; 

    ... 

    m_program.addShaderFromSourceCode(QOpenGLShader::Vertex, vs); 

    ... 

    m_functions = *functions; 

    m_functions.glGenVertexArrays(1, &m_vaoId); 
    m_functions.glGenBuffers(3, m_vboIds); 

    m_functions.glBindVertexArray(m_vaoId); 
    m_functions.glEnableVertexAttribArray(m_vertexAttribute); 
    m_functions.glEnableVertexAttribArray(m_colorAttribute); 
    m_functions.glEnableVertexAttribArray(m_sizeAttribute); 

    ... 
} 

ときコールm_program.addShaderFromSourceCode(QOpenGLShader::Vertex, vs);

+3

簡単な解決策:QtをOpenGLに使用しないでください。あなたのコードはQtなしですでに書かれていたと言いますが、なぜそれを移植するのですか? – ybungalobill

+0

@ybungalobillそれは私にとっては不可能ではない:)私は半分の完全なデスクトップアプリケーションとこのアプリケーションのためのこのちょうど新しい機能を持っています。私はこのアプリケーションを書き直すことはできません...私はこの問題を解決しない場合、Qpainterの私のbox2dポートを使用しています。しかし、私はこのポートを使用してOpenGLの動作がより速く、Qpainterを使用したくない。 – iMashine

答えて

2

場合、私はエラーを取得しますGLSL #version 140に固執して、次の行を置き換えたいと考えています。

layout(location = 0) in vec2 v_position; 
layout(location = 1) in vec4 v_color; 
layout(location = 2) in float v_size; 

明示的な属性の位置が#version 330

までGLSLの一部ではありません

in vec2 v_position; 
in vec4 v_color; 
in float v_size; 

によってあなたのC++コードでそれを有効にする前に、あなたのシェーダの属性の位置を照会することの後に注意してください。シェーダコンパイラは、宣言の順に並べ替えることもあれば、並べ替えることもできません。私はGLSLの#version 35ページ

で#version 330まで言及していない140

https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.1.40.pdf

のドキュメントでレイアウトのは言及しない(場所= x)を見つけた

const int POS_LOCATION = glGetAttribLocation(program_id, "v_position"); 
if(-1 != POS_LOCATION) 
{ 
    glEnableVertexAttribArray(POS_LOCATION); 
    ... 
    glVertexAttribPointer(POS_LOCATION, ...); 
    ... 
} 

https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.3.30.pdf

あなたのケースでは、シェーダコンパイラのエラーメッセージが少し誤解を招くことがあります。おそらく、グラフィックカードドライバを更新すると、より良いシェーダコンパイラが得られるでしょう。

+0

ありがとう、少しお手伝いしましたが、問題は少し異なりました。私は後で解決します。 – iMashine

0

デスクトップ用のGLSLがOpenGL ESのGLSLと同じではないことを考慮しませんでした。 This topic少し助けてくれました。私はすべてinattributeまたはvaryingに変更し、すべてoutからvaryingに変更し、floatの精度も設定します。変更後、シェイダーがコンパイルされました。最後に、私のシェーダコードは次のようになります:

precision lowp float; 

uniform mat4 projectionMatrix; 
attribute vec2 v_position; 
attribute vec4 v_color; 
attribute float v_size; 
varying vec4 f_color; 

void main(void) 
{ 
    f_color = v_color; 
    gl_Position = projectionMatrix * vec4(v_position, 0.0, 1.0); 
    gl_PointSize = v_size; 
} 

ありがとうございました!

関連する問題