0

私はopenglプログラミングで手を試し、コードブロックにデフォルトの例をロードしました.関数ポインタのロードをたくさん行った後、特定の色でクリアできるウィンドウにopengl 4.3コンテキストを取得しました(YES! )、先に進んで三角形をレンダリングしようとしました...うまく機能していません。どこが間違っていたのかわかりません。VBOとシェーダーの作成が間違っていないかどうかを確認するために、Googleとデバッガーの暗いコーナーを回っていました..運が悪い

関連する gl コードは次のとおりです。

GLuint IndiceArray[3] = {
0, 1, 2
};

const float vertexPositions[] = {
    0.75f, 0.75f,
    0.75f, -0.75f,
    -0.75f, -0.75f,
};

const float vertexColors[] = {
    1.0f, 0.0f, 0.0f, 1.0f,
    0.0f, 1.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f,
};

//Prepare GPU program
vertexID = glCreateShader( GL_VERTEX_SHADER );
fragmentID = glCreateShader( GL_FRAGMENT_SHADER );

glShaderSource(vertexID, 1, &vsSource, NULL) ;
glShaderSource(fragmentID, 1, &fsSource, NULL) ;

glCompileShader( vertexID );
glCompileShader( fragmentID );

programID = glCreateProgram();
glAttachShader( programID, vertexID );
glAttachShader( programID, fragmentID );
glLinkProgram( programID );
glUseProgram( programID );

//Send to OpenGL
glGenBuffers(3, vertexAttribBufferID);

glBindBuffer( GL_ARRAY_BUFFER, vertexAttribBufferID[0] );
glBufferData( GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW );

glBindBuffer( GL_ARRAY_BUFFER, vertexAttribBufferID[1] );
glBufferData( GL_ARRAY_BUFFER, sizeof(vertexColors), vertexColors, GL_STATIC_DRAW );

glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vertexAttribBufferID[2] );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(IndiceArray), IndiceArray, GL_STATIC_DRAW );

colorAttribID = glGetAttribLocation( programID, "colorIn" );
positionAttribID = glGetAttribLocation( programID, "vertexPos" );

/* program main loop */
while (!bQuit)
{
    /* check for messages */
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        /* handle or dispatch messages */
        if (msg.message == WM_QUIT)
        {
            bQuit = TRUE;
        }
        else
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    else
    {
        /* OpenGL animation code goes here */

        glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        //Render!!
        glBindBuffer( GL_ARRAY_BUFFER, vertexAttribBufferID[0] );
        glEnableVertexAttribArray( positionAttribID );
        glVertexAttribPointer( positionAttribID, 2, GL_FLOAT, GL_FALSE, 0, 0 );

        glBindBuffer( GL_ARRAY_BUFFER, vertexAttribBufferID[1] );
        glEnableVertexAttribArray( colorAttribID );
        glVertexAttribPointer( colorAttribID, 4, GL_FLOAT, GL_FALSE, 0, 0 );

        glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vertexAttribBufferID[2] );

        glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0 );
        glDisableVertexAttribArray( colorAttribID );
        glDisableVertexAttribArray( positionAttribID );

        SwapBuffers(hDC);
        Sleep (1);
    } 

そしてシェーダー:

const char vertexShader[] =
"#version 150 core\n"

"in vec2 vertexPos;\n"
"in vec4 colorIn;\n"
"smooth out vec4 outColor;\n"

"void main()\n"
"{\n"
"   gl_Position = vec4(vertexPos, 0.0f, 1.0f);\n"
"   outColor = colorIn;\n"
"}";

const char fragShader[] =
"#version 150 core\n"

"smooth in vec4 inColor;\n"
"out vec4 f_color;\n"

"void main()\n"
"{\n"
"   f_color = inColor;\n"
"}";

言うまでもなく、私はどんな助けにも感謝します.

編集:あなたが疑問に思っている場合に備えて、クリアされた背景しか表示されません...

4

1 に答える 1

0

わかりました: どうやら、シェーダー間で渡すデータは両側の変数と同じ名前でなければならないので、私のコードは次のようになります。

const char vertexShader[] =
"#version 150 core\n"

"in vec2 vertexPos;\n"
"in vec4 colorIn;\n"
"smooth out vec4 outColor;\n"

"void main()\n"
"{\n"
"   gl_Position = vec4(vertexPos, 0.0f, 1.0f);\n"
"   outColor = colorIn;\n"
"}";

const char fragShader[] =
"#version 150 core\n"

"smooth in vec4 outColor;\n"
"out vec4 f_color;\n"

"void main()\n"
"{\n"
"   f_color = inColor;\n"
"}";
于 2013-01-16T13:01:28.247 に答える