2016-06-02 11 views
0

私はC++を学び始めました。色付きの三角形を描画するシェーダを使ってプログラムを作成しようとしています。C++ OpenGLシェーダが動作しない

これは私の頂点シェーダです:

const GLchar* vertexSource = 
"#version 150 core\n" 
"in vec4 position;" 
"in vec4 color;" 
"out vec4 Color;" 
"out vec4 gl_Position;" 
"void main(){" 
" gl_Position = position;" 
" Color = color;" 
"}"; 

と、これは私のフラグメントシェーダです:

const GLchar* fragmentSource = 
"#version 150 core\n" 
"in vec4 Color;" 
"out vec4 gl_FragColor" 
"void main(){" 
" gl_FragColor = Color;" 
"}"; 

私はそれぞれ共同ordsと色の値のリストを持っている:

float vertices[]{ 
    -1.0f, -1.0f, 0.0f,1.0f, 1.0f,0.0f,0.0f,1.0f, 
    1.0f, -1.0f, 0.0f,1.0f, 0.0f,1.0f,0.0f,1.0f, 
    0.0f, 1.0f, 0.0f,1.0f, 0.0f,0.0f,1.0f,1.0f, 
}; 

「頂点バッファオブジェクト」と「頂点アレイオブジェクト」を初期化します

ループ

'ながら、行う'

glBindAttribLocation(shaderProgram, 0, "position"); 
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), 0); 
glEnableVertexAttribArray(0); 

glBindAttribLocation(shaderProgram, 1 ,"color"); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(4 * sizeof(float))); 
glEnableVertexAttribArray(1); 

をし、最終的に私は三角形を描く:

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertexShader, 1, &vertexSource, NULL); 
glCompileShader(vertexShader); 

GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fragmentShader, 1, &fragmentSource, NULL); 
glCompileShader(fragmentShader); 

GLuint shaderProgram = glCreateProgram(); 
glAttachShader(shaderProgram, vertexShader); 
glAttachShader(shaderProgram, fragmentShader); 
glLinkProgram(shaderProgram); 

glUseProgram(shaderProgram); 

私はシェーダのためのいくつかの属性を定義します

GLuint vao; //Initialise vertex array object 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

GLuint vbo; //Initialise vertex buffer object 
glGenBuffers(1,&vbo); 
glBindBuffer(GL_ARRAY_BUFFER,vbo); 
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW); 

私はシェーダプログラムをコンパイル

glDrawArrays(GL_TRIANGLES, 0, 3); 

しかし、三角形は印刷されませんが、代わりに 黒いスクリーン。

私はチュートリアルのオンラインからこのコードの大半を得て、すべてのことがどのように機能するかを理解するためにすべてを書き直そうとしています。

どこに間違っていたのか誰にでも見えますか?何かアドバイスをいただければ幸いです:)

編集:私はエラーをチェックするためにいくつかのコードを追加しました

if (status == GL_FALSE) 
{ 
    GLint infoLogLength; 
    glGetShaderiv(shaderProgram, GL_INFO_LOG_LENGTH, &infoLogLength); 

    GLchar* strInfoLog = new GLchar[infoLogLength + 1]; 
    glGetProgramInfoLog(shaderProgram, infoLogLength, NULL, strInfoLog); 

    std::cout << strInfoLog; 
    delete[] strInfoLog; 
} 

...しかし、何も印刷さ

+3

まず、 '/ n'は' \ n'と同じではありません。次に、シェーダのコンパイル時にエラーメッセージがないかどうかを確認する必要があります。 'glGetShaderInfoLog()'を使用してください。 –

+0

あなたは、あなたが問題を抱えていることを述べなかった、コンパイルエラー?描画の問題? –

+0

プログラムを実行すると空白の画面が表示される –

答えて

1

gl_PositionはプレあなたのGLSLコンパイラは、それを再定義しようとするとエラーを出すことに不満を抱いています。同様にgl_FragColorは予約された名前空間にあります。

もちろん、コードにシェーダ情報ログのクエリがないため、コンパイラの出力は表示されません。あなたの補遺はプログラムのリンカーログを照会するだけです。

解決策は、シェーダーソースからout vec4 gl_Positionout vec4 gl_FragColorを単に省略するだけの簡単な方法でしょう。

+1

私はまた、 ";"この行には: "vec4 gl_FragColor"があります。このため、フラグメントコンパイルが失敗する可能性があります。 –

+0

奇妙な;私は両方のエラーを修正しましたが、まだ何も起こりません。他の何か? –

+0

@AdrianNgai:さらに診断を追加します。あなたのオリジナルの質問にコメントしました。リンクされたリポジトリには、いくつかの診断用品があります。 – datenwolf

関連する問題