私は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を実行することはできませんが、もし皆さんが私はあなたを信頼できると言います。
シェイダーがエラーなしでコンパイルされリンクされているかどうかを確認していますか?コンパイルエラーが発生すると、 'shader_programme'は有効なプログラムオブジェクトではないので、' glUseShader'もエラーを投げます。 – BDL
私はそれを確認しました bool is_program = glIsProgram(shader_programme); qDebug()<< is_program;ループの直前で がtrueを返すので、シェーダがうまくいると思いますが、それはあなたが意味するものですか? –
@ Lauriane.Cいいえ、そうではありません。 'glIs *()'はオブジェクトが 'glGen *()'(または 'glCreate *()')で作成されたかどうかをチェックします。 'glGetShaderiv(...、GL_COMPILE_STATUS、...)'と 'glGetProgramiv(...、GL_LINK_STATUS、...)'を使う必要があります。それらがfalseを返す場合は、エラー(およびそれらの関数から取得できる情報ログ)を出力する必要があります。 – HolyBlackCat