2016-08-03 7 views
-1

OpenGLで初心者です。私はQtを知っているOpenGLの最初の例としてQtの次の例を使用しました。
http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-squircle-cpp.htmlOpen gl描画は、1つのフレームを描画した後に白くなります。

プログラムのペイント機能をチェスボードパターンを描く意図で次のコードに置き換えました。次は私のプログラムの塗装やレンダー機能ではありません

paint() 
{ 
if (!m_program) { 
    initializeOpenGLFunctions(); 

    m_program = new QOpenGLShaderProgram(); 
    m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, 
             "attribute highp vec4 vertices;" 
             "varying highp vec2 coords;" 
             "void main() {" 
             " gl_Position = vertices;" 
             " coords = vertices.xy;" 
             "}"); 
    m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, 
             "uniform lowp float t;" 
             "varying highp vec2 coords;" 
             "void main() {" 
             " lowp float i = 1. - (pow(abs(coords.x), 4.) + pow(abs(coords.y), 4.));" 
             " i = smoothstep(t - 0.8, t + 0.8, i);" 
             " i = floor(i * 20.)/20.;" 
             " gl_FragColor = vec4(coords * .5 + .5, i, i);" 
             "}"); 

    m_program->bindAttributeLocation("vertices", 0); 
    m_program->link(); 
} 

auto width = static_cast<float>(m_viewportSize.width()); 
auto height = static_cast<float>(m_viewportSize.height()); 
auto a = 2.f/width; 
auto b = 2.f/height; 
std::vector<float> matrix = 
{ 
    a , 0, 0, 0, 
    0, -b, 0, 0, 
    0, 0, 1, 0, 
    -1, 1, 0, 1 
}; 

// Set the projection matrix 
glMatrixMode(GL_PROJECTION); 
glLoadMatrixf(matrix.data()); 

// Initialize vertices: 
std::vector<float> vertices = 
{ 
    0,  0, 
    0,  height, 
    width, height, 
    width, 0 
}; 

// Initialize colors 
std::vector<float> colors = 
{ 
    1, 0, 0, 
    0, 1, 0, 
    0, 0, 1, 
    0, 1, 1 
}; 

// Initialize texture virtice 
std::vector<float> texCoord = 
{ 
    0, 0, 
    0, 1, 
    1, 1, 
    1, 0 
}; 

// Create texture: simple chess board 8x8 
auto numRows = 8u; 
auto numCols = 8u; 
auto character = 172u; 
auto remain = 255u - character; 
std::vector<unsigned char> texture(numCols * numRows); 
for (auto i = 0u; i < texture.size(); ++i) 
    texture[i] = ((i + (i/numCols)) % 2) * remain + character; 

// Upload to GPU texture 
unsigned textureID; 
glGenTextures(1, &textureID); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, numCols, numRows, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, texture.data()); 

// Initialize clear colors 
glClearColor(0.f, 0.f, 0.f, 1.f); 
// Activate necessary states 
glEnable(GL_TEXTURE_2D); 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glVertexPointer(2, GL_FLOAT, 0, vertices.data()); 
glColorPointer(3, GL_FLOAT, 0, colors.data()); 
glTexCoordPointer(2, GL_FLOAT, 0, texCoord.data()); 

// render 
glClear(GL_COLOR_BUFFER_BIT); 
glDrawArrays(GL_QUADS, 0, 4); 

m_program->disableAttributeArray(0); 
m_program->release(); 
m_window->resetOpenGLState(); 
} 

チェス盤が描かれています。しかし、それは分割された秒のために描画されます&その後、画面は完全に白くなります。チェスボードのパターンを各フレームのドローに合わせて忠実に描きたい。 誰かが間違っている可能性があることを指摘できますか?

if (!m_program) { 

その後、あなたが持っている一番下に、m_programを初期化します:glUseProgram(0);を呼び出すことと同等であるコメントでハリッシュが指摘するように

m_program->release(); 

非常にあなたが持っている一番上に

+0

はい、最後の5行を見て、1つのフレームを描画しているときは、GLプログラムを解放してウィンドウをリセットします。 –

+0

私は最後の3行をコメントアウトしましたが、それは役に立ちません。 –

+0

私の質問はなぜ投票されたのですか?どうしたの ? –

答えて

1

。したがって、次の反復であるpaintでは、シェーダはバインドされておらず、使用できません。

ドキュメントによると、release();の逆はそう(私はこのクラスの専門家ではないです)ソリューションは、あなたのpaintの次の反復にQOpenGLShaderProgram::bind()を呼び出すことがあるかもしれないbind();です。

+0

'm_program-> release()'は 'glUseProgram(0)'と同じです。彼のコードでメモリリークを引き起こすかもしれませんが、なぜ彼は白い画面を取得していません。リンクを参照してくださいhttp://doc.qt.io/qt-5/qopenglshaderprogram.html#release – Harish

+0

@ハリッシュ私の答えがより有用である場合今すぐ参照してください – marcinj

+0

呼び出しバインドは、すべてのフレームを連続してデータを表示します。 addShaderFromSourceCodeの呼び出しもコメントしました。私がopen glの初心者だと言ったように、私はhttp://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-squircle-cpp.htmlのサンプルをコピーしました。私が持っているイメージから私自身のcharデータを提供する私の目標は、私が持っている実際のイメージデータ(unsigned char array)でチェスボードパターンを置き換えました。私が右にいるかどうかコメントしてください。この議論は確か私の人のために役立った –

0

将来的には、gDEbuggerのようなグラフィックスデバッガを使ってopenglプログラムを実行し、実際にAPI内部で何が起こっているのかを把握することをお勧めします。

+0

良い点@ソムベロの子供。私はgDebbuggerを手に入れようとします。現時点では、私はAPIの背後で起こっている不思議なことのほとんどです –

関連する問題