1

これらの質問は非常に基本的なものかもしれませんので、ご容赦ください。

私は非常に小さな Qt プログラムを作成して OpenGL をいじり、レンダリング方法について学び、色付きの三角形が機能するようにしました (このチュートリアルhttp://qt-project.org/wiki/How_to_use_OpenGL_Core_Profile_with_Qtを拡張します)。私の問題は、三角形に適用しようとする変換が何もしないことです。これに加えて、パラメーターを glOrtho に変更してもディスプレイには何も起こらないようです。また、glViewport へのパラメーターがどのように機能するのかわかりません。パラメーターを小さくすると、3D ワールドのレンダリング領域が大きくなるようです。 .

コード:

これは私の頂点/インデックス配列です (vec3 位置、vec3 色)

static GLfloat tri[] = { -0.5f, -0.5f, 0.0f,  0.0f, 0.0f, 1.0f,
                        0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,
                        0.0f,  0.5f, 0.0f,  1.0f, 0.0f, 0.0f };

static GLuint tri_ind[] = { 0, 1, 2 };

static int SIZEOF_TRI = 2 * 3 * 3 * sizeof(GLfloat);
static int SIZEOF_TRI_IND = 3 * sizeof(GLuint);
static int NUM_TRI_VERTS = 3;

私の OpenGL ウィジェットは、頂点およびインデックス バッファーに Qt のバッファー オブジェクトを使用します。

class GLWidget : public QGLWidget
{
    Q_OBJECT
public:
    GLWidget( const QGLFormat& format, QWidget* parent = 0 );

protected:
    virtual void initializeGL();
    virtual void resizeGL( int w, int h );
    virtual void paintGL();

    virtual void keyPressEvent( QKeyEvent* e );

private:
    bool prepareShaderProgram( const QString& vertexShaderPath,
                               const QString& fragmentShaderPath );

    QGLShaderProgram m_shader;
    QGLBuffer m_vertexBuffer;
    QGLBuffer m_indexBuffer;
};

コンストラクターはバッファーを初期化します。

GLWidget::GLWidget( const QGLFormat& format, QWidget* parent )
    : QGLWidget( format, parent ),
      m_vertexBuffer( QGLBuffer::VertexBuffer ),
      m_indexBuffer( QGLBuffer::IndexBuffer )
{
}

initialiseGL は残りを初期化します。

void GLWidget::initializeGL()
{
    QGLFormat glFormat = QGLWidget::format();
    if ( !glFormat.sampleBuffers() )
        qWarning() << "Could not enable sample buffers";

    // Set the clear color to black
    glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );

    glClearDepth(1.0);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    // Prepare a complete shader program...
    QString vert = QCoreApplication::applicationDirPath() + "/simple.vert";
    QString frag = QCoreApplication::applicationDirPath() + "/simple.frag";
    if ( !prepareShaderProgram( vert, frag ) )
        return;

    // Bind the shader program so that we can associate variables from
    // our application to the shaders
    if ( !m_shader.bind() )
    {
        qWarning() << "Could not bind shader program to context";
        return;
    }

    // We need us some vertex data. Start simple with a triangle ;-)
    GLfloat* points = tri;
    m_vertexBuffer.create();
    m_vertexBuffer.setUsagePattern( QGLBuffer::StaticDraw );
    if ( !m_vertexBuffer.bind() )
    {
        qWarning() << "Could not bind vertex buffer to the context";
        return;
    }
    m_vertexBuffer.allocate( points, SIZEOF_TRI );

    // Indices
    GLuint* indices = tri_ind;
    m_indexBuffer.create();
    m_indexBuffer.setUsagePattern( QGLBuffer::StaticDraw );
    if ( !m_indexBuffer.bind() )
    {
        qWarning() << "Could not bind vertex buffer to the context";
        return;
    }
    m_indexBuffer.allocate( indices, SIZEOF_TRI_IND );


    // Enable the "vertex" attribute to bind it to our currently bound
    // vertex buffer.
    m_shader.setAttributeBuffer( "vertex", GL_FLOAT, 0, 3, 6 * sizeof(GLfloat) );
    m_shader.enableAttributeArray( "vertex" );
    m_shader.setAttributeBuffer( "color", GL_FLOAT, 3 * sizeof(GLfloat), 3, 6 * sizeof(GLfloat) );
    m_shader.enableAttributeArray( "color" );
}

そして、paintGL は変換を行い、頂点を描画します。

void GLWidget::paintGL()
{
    // Clear the buffer with the current clearing color
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    // Draw stuff
    glLoadIdentity();
    glTranslatef(10.0, 10.0, 0.0);
    glDrawArrays( GL_TRIANGLES, 0, NUM_TRI_VERTS );
}

三角形は、翻訳を追加する前とまったく同じに見えます。

さらに、resizeGL (ウィジェットのサイズ変更時) では、params を glOrtho に変更しても表示には影響しません。+-5 と +-10 の間に差はありませんでした。glViewport の幅と高さをそれぞれ 100 に設定し、次にそれぞれ 200 に設定すると、値が 100 の場合よりも 200 の場合の方が三角形が (左下隅に) 大きく表示されます。内部のオブジェクトが小さく見えることを意味しますが、何かが足りないのかもしれません。

void GLWidget::resizeGL( int w, int h )
{
    // Set the viewport to window dimensions
    glViewport( 0, 0, w, qMax( h, 1 ) );

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-10.0, 10.0, -10.0, 10.0, -5.0, 100.0);
    glMatrixMode(GL_MODELVIEW);
}

誰でも正しい方向への指針を教えてもらえますか?

ありがとう。

編集: 頂点シェーダー:

#version 330

in vec3 vertex;
in vec3 color;
out vec3 Color;

void main( void )
{
    Color = color;
    gl_Position = vec4(vertex, 1.0);
}

フラグメント シェーダー:

#version 330
 
layout(location = 0, index = 0) out vec4 fragColor;
in vec3 Color;
 
void main( void )
{
    fragColor = vec4(Color, 1.0);
}
4

1 に答える 1

3

シェーダーは、OpenGL-3.3 以降のコア プロファイルで動作するように記述されています。コア プロファイルで機能しない非推奨の固定関数パイプライン メソッド (glMatrixMode、glLoadIdentity、glTranslate など) を使用しています。GLM、Eigen、または linmath.h などの実数行列数学ライブラリを使用して行列を計算し、シェーダー ユニフォームに渡します。

于 2013-08-17T11:52:29.983 に答える