2016-07-11 27 views
0

私はAnton Gerdelanのチュートリアル "hello triangle"からコードを実行しようとしていますが、基本的にはQtCreatorにコピーして貼り付けています。OpenGLの "Hello Triangle"の結果、黒いウィンドウが表示される?

私は含まれています:GL/glew.h、GLFW/glfw3.h、stdio.h。私はまだ取得しかし

Renderer: Mesa DRI Intel(R) G41 
OpenGL version supported 2.1 Mesa 11.2.0 

:プログラムがあることを私に伝えますので

int main() { 
// start GL context and O/S window using the GLFW helper library 
if (!glfwInit()) { 
    fprintf (stderr, "ERROR: could not start GLFW3\n"); 
    return 1; 
} 

GLFWwindow* window = glfwCreateWindow (640, 480, "Hello Triangle", NULL, NULL); 
if (!window) { 
    fprintf (stderr, "ERROR: could not open window with GLFW3\n"); 
    glfwTerminate(); 
    return 1; 
} 
glfwMakeContextCurrent (window); 

// start GLEW extension handler 
glewExperimental = GL_TRUE; 
glewInit(); 

// get version info 
const GLubyte* renderer = glGetString (GL_RENDERER); // get renderer string 
const GLubyte* version = glGetString (GL_VERSION); // version as a string 
printf ("Renderer: %s\n", renderer); 
printf ("OpenGL version supported %s\n", version); 

// tell GL to only draw onto a pixel if the shape is closer to the viewer 
glEnable (GL_DEPTH_TEST); // enable depth-testing 
glDepthFunc (GL_LESS); // depth-testing interprets a smaller value as "closer" 

float points[] = { 
0.0f, 0.5f, 0.0f, 
0.5f, -0.5f, 0.0f, 
-0.5f, -0.5f, 0.0f 
}; 


GLuint vbo = 0; 
glGenBuffers (1, &vbo); 
glBindBuffer (GL_ARRAY_BUFFER, vbo); 
glBufferData (GL_ARRAY_BUFFER, 9 * sizeof (float), points, GL_STATIC_DRAW); 

GLuint vao = 0; 
glGenVertexArrays (1, &vao); 
glBindVertexArray (vao); 
glEnableVertexAttribArray (0); 
glBindBuffer (GL_ARRAY_BUFFER, vbo); 
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, NULL); 

const char* vertex_shader = 
"#version 120\n" 
"in vec3 vp;" 
"void main() {" 
" gl_Position = vec4 (vp, 1.0);" 
"}"; 

const char* fragment_shader = 
"#version 120\n" 
"out vec4 frag_colour;" 
"void main() {" 
" frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);" 
"}"; 

GLuint vs = glCreateShader (GL_VERTEX_SHADER); 
glShaderSource (vs, 1, &vertex_shader, NULL); 
glCompileShader (vs); 
GLuint fs = glCreateShader (GL_FRAGMENT_SHADER); 
glShaderSource (fs, 1, &fragment_shader, NULL); 
glCompileShader (fs); 

GLuint shader_programme = glCreateProgram(); 
glAttachShader (shader_programme, fs); 
glAttachShader (shader_programme, vs); 
glLinkProgram (shader_programme); 

while (!glfwWindowShouldClose (window)) { 
// wipe the drawing surface clear 
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glUseProgram (shader_programme); 

glBindVertexArray (vao); 
// draw points 0-3 from the currently bound VAO with current in-use shader 
glDrawArrays (GL_TRIANGLES, 0, 3); 
// update other events like input handling 
glfwPollEvents(); 
// put the stuff we've been drawing onto the display 
glfwSwapBuffers (window); 
} 

// close GL context and any other GLFW resources 
glfwTerminate(); 
return 0; 
} 

が古い同様のトピックBlack screen on Anton's OpenGL Hello Triangle Tutorialを読んだ、私は、アドバイスに従い、シェーダで400から120に#versionを変更しました空の黒い窓。 私はエラーがどこにあるかを見つけるために、これを使用:

if (glGetError() == GL_NO_ERROR) { 
    qDebug() << "no errors"; 
} 
else { 
    qDebug() << "errors" ; 
} 

そして、どうやらそれはglUseProgram(shader_programme)です。

どうすればよいですか?私のGPUがこのコードを実行するには弱すぎるのですか、何か間違っていますか?

ありがとう、

ローリアーヌ。

EDIT:

私は、次のデバッグを追加しました:

GLuint shader_programme = glCreateProgram(); 
glAttachShader (shader_programme, vs); 
glAttachShader (shader_programme, fs); 
glLinkProgram (shader_programme); 


GLint isCompiled ; 
glGetShaderiv(shader_programme, GL_COMPILE_STATUS, &isCompiled); 
if (isCompiled == GL_FALSE) 
{ 
    qDebug() << "not compiled" ; 
    GLint maxLength = 0; 
    glGetShaderiv(shader_programme, GL_INFO_LOG_LENGTH, &maxLength); 
    qDebug() << maxLength ; 
    // The maxLength includes the NULL character 
    std::vector<GLchar> errorLog(maxLength); 
    glGetShaderInfoLog(shader_programme, maxLength, &maxLength, &errorLog[0]); 

} 

GLint isLinked ; 
glGetProgramiv(shader_programme, GL_LINK_STATUS, &isLinked); ; 
if (isLinked == GL_FALSE) { 
    qDebug() << "not linked" ; 
    GLint maxLength2 = 0; 
    glGetShaderiv(shader_programme, GL_INFO_LOG_LENGTH, &maxLength2); 
    qDebug() << maxLength2 ; 
    // The maxLength includes the NULL character 
    std::vector<GLchar> errorLog(maxLength2); 
    glGetShaderInfoLog(shader_programme, maxLength2, &maxLength2, &errorLog[0]); 
} 

それは0、 "リンクされていない" を返します。

GLint success; 
glGetProgramiv(shader_programme, GL_LINK_STATUS, &success); 
if(!success) 
{ 
    GLchar infoLog[512]; 
    glGetProgramInfoLog(shader_programme, 512, NULL, infoLog); 
    qDebug() << infoLog ; 
} 

エラー:エラー:コンパイルされていないshadererrorとのリンク:コンパイルされていないシェーダとのリンク。

トピックは、私は次のようなものに自分のシェーダを変更すると、それが正常に動作します、ということを思い出してみたかった(私のために)混乱するので:

私はそれがあるかもしれないと思わせる
const char* vertex_shader = 
"#version 120\n" 
"attribute vec3 vp;" 
"void main() {" 
" gl_Position = vec4 (vp, 1.0);" 
"}"; 

const char* fragment_shader = 
"#version 120\n" 
"void main() {" 
" gl_FragColor = vec4 (0.5, 0.0, 0.5, 1.0);" 
"}"; 

互換性の問題は...

編集編集:私は私のデバッグがナンセンスに気づいたし、それを変更しBDLのアドバイスで :

GLint isCompiled ; 
glGetShaderiv(vs, GL_COMPILE_STATUS, &isCompiled); 
if (isCompiled == GL_FALSE) 
{ 
    qDebug() << "vs not compiled" ; 
    GLint maxLength = 0; 
    glGetShaderiv(vs, GL_INFO_LOG_LENGTH, &maxLength); 
    GLchar errorLog[maxLength]; 
    glGetShaderInfoLog(vs, maxLength, NULL, errorLog); 
    qDebug() << errorLog ; 
} 

glGetShaderiv(fs, GL_COMPILE_STATUS, &isCompiled); 
if (isCompiled == GL_FALSE) 
{ 
    qDebug() << "fs not compiled" ; 
    GLint maxLength = 0; 
    glGetShaderiv(fs, GL_INFO_LOG_LENGTH, &maxLength); 
    GLchar errorLog[maxLength]; 
    glGetShaderInfoLog(fs, maxLength, NULL, errorLog); 
    qDebug() << errorLog ; 
} 

出力は次のとおりです。

vs not compiled 
0:1(10): error: GLSL 2.10 is not supported. Supported versions are: 1.10, 1.20, and 1.00 ES 

fs not compiled 
0:1(10): error: GLSL 2.10 is not supported. Supported versions are: 1.10, 1.20, and 1.00 ES 

Iは、バージョンの(Iウィンドウを開くことが可能にされることなく有することができる最大値である)glWindowHint 2.1感謝を求め、#version 210を設定します。

私はバージョン1.2を尋ねると#version 120に設定し、私はエラーを取得する: コンパイルされていない対 0:2(1):エラー:in' qualifier in declaration of VP」 fsがコンパイルされていないGLSL 1.20で関数パラメータのみに有効 0:2(1):エラー:その他 『属性』私はより多くの確信していると、古い構文に私のシェーダを変更するために私をリードGLSL 1.20

における関数パラメータのみに有効out' qualifier in declaration of frag_colour」私はちょうどこの非常に安いコンピュータ上で新しいOpenGLを実行することはできませんが、もし皆さんが私はあなたを信頼できると言います。

+0

シェイダーがエラーなしでコンパイルされリンクされているかどうかを確認していますか?コンパイルエラーが発生すると、 'shader_programme'は有効なプログラムオブジェクトではないので、' glUseShader'もエラーを投げます。 – BDL

+0

私はそれを確認しました bool is_program = glIsProgram(shader_programme); qDebug()<< is_program;ループの直前で がtrueを返すので、シェーダがうまくいると思いますが、それはあなたが意味するものですか? –

+0

@ Lauriane.Cいいえ、そうではありません。 'glIs *()'はオブジェクトが 'glGen *()'(または 'glCreate *()')で作成されたかどうかをチェックします。 'glGetShaderiv(...、GL_COMPILE_STATUS、...)'と 'glGetProgramiv(...、GL_LINK_STATUS、...)'を使う必要があります。それらがfalseを返す場合は、エラー(およびそれらの関数から取得できる情報ログ)を出力する必要があります。 – HolyBlackCat

答えて

0
vs not compiled 
0:1(10): error: GLSL 2.10 is not supported. Supported versions are: 1.10, 1.20, and 1.00 ES 

このエラーメッセージは非常に明確です。あなたはGLSL 2.10 が存在しないことに気づくべきです。 OpenGL 2.1にはGLSLバージョン1.20が付属しているため、これを使用する必要があります。 GLSLバージョンとGLバージョンの間のマッピングは、歴史的な理由から少し不便です。詳細はthis answerをご覧ください。

When I ask for version 1.2

まず、あなたはそれを行うことはできません。特定のバージョンの問い合わせは、GL 3.xで導入されました。 GL 2.1を求めたり1.2を求めても違いはありません。特定のバージョンを何も求めていないときと同じようになります。そして、それは通常互換性プロファイルでサポートされている最高GLバージョンになります。実際には、互換性プロファイルをサポートしていない実装、またはGPUでサポートされている最高のバージョン(nvidiaやAMD独自のドライバでは最近の4.5まで)で最大2.1になる可能性が最も高いということです。詳細についてはthis answerをご覧ください。

and set #version 120 , I get the error:

vs not compiled 0:2(1): error: in' qualifier in declaration ofvp' only valid for function parameters in GLSL 1.20 fs not compiled 0:2(1): error: out' qualifier in declaration offrag_colour' only valid for function parameters in GLSL 1.20 

このエラーメッセージも非常に明確です。 @HolyBlackCatはすでにコメントで指摘されているように、GLSL 1.20では汎用のinoutの構文を使用できません。このシンタックスは、GLSL 1.30/OpenGL 3.0(thridプログラマブルステージとしてのジオメトリシェーダの導入)で導入されました。いくつかのGLSL> = 1.30コードを取って、GLSL 1.20にバージョンを戻して、それがうまくいくことを願ってください。

+0

この回答をありがとう、非常に明確です。 #version 210のおかげで申し訳ありませんでしたが、それは本当に愚かでした。 エラーメッセージがはっきりしていると言いますが、このトピックでは、サポートされているバージョンが1.1と1.2であると私に教えてくれましたが、新しい構文(so> = 1.30) 。これから、私はそれを機能させるために考えられるすべてのものを試し始めました。 最後に昨日、私は適切なGPUを持っているコンピュータにハードドライブをセットアップしました。今は "サポートされているバージョン3.0"となっています。仕様は#version 130です。 –

関連する問題