私は今openglを学んでいます。私はOpenGL Superbibleという本を買った。しかし、私は環境を正しく構成するために生き残ることができませんでした。私は、GLFW 3.2をウィンドウツールキット(それが呼び出されている場合)とGLEW 2.0として使用します。glCreateVertexArraysを使用しているときに黒い画面が表示される
私はスクリーンに描画するためにシェーダをコンパイルして使用しようとしています。本によると、これは画面上に三角形を描くはずです。しかし、それはしません。代わりに、glClearColor
で設定されている透明な背景色が表示されます。
これはCodeです:
#include <iostream>
#include <GLFW\glfw3.h>
#include <GL\glew.h>
GLuint CompileShaders();
int main(void) {
// Initialise GLFW
if (!glfwInit()) {
fprintf(stderr, "Failed to initialize GLFW\n");
getchar();
return -1;
}
// Open a window and create its OpenGL context
GLFWwindow *window;
window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL);
if (window == NULL) {
fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, "
"they are not 3.3 compatible. Try the 2.1 version of the "
"tutorials.\n");
getchar();
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// Initialize GLEW
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
getchar();
glfwTerminate();
return -1;
}
// Ensure we can capture the escape key being pressed below
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
GLuint RederingProgram = CompileShaders();
GLuint VertexArrayObject;
glCreateVertexArrays(1, &VertexArrayObject);
glBindVertexArray(VertexArrayObject);
int LoopCounter = 0;
do {
// Clear the screen. It's not mentioned before Tutorial 02, but it can cause
// flickering, so it's there nonetheless.
/*const GLfloat red[] = {
(float)sin(LoopCounter++/100.0f)*0.5f + 0.5f,
(float)cos(LoopCounter++/100.0f)*0.5f + 0.5f,
0.0f, 1.0f
};*/
// glClearBufferfv(GL_COLOR, 0, red);
// Draw nothing, see you in tutorial 2 !
glUseProgram(RederingProgram);
glDrawArrays(GL_TRIANGLES, 0, 3);
// Swap buffers
glfwSwapBuffers(window);
glfwPollEvents();
} // Check if the ESC key was pressed or the window was closed
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0);
// Close OpenGL window and terminate GLFW
glfwTerminate();
return 0;
}
GLuint CompileShaders() {
GLuint VertexShader;
GLuint FragmentShader;
GLuint Program;
static const GLchar *VertexShaderSource[] = {
"#version 450 core "
" "
"\n",
" "
" \n",
"void main(void) "
" "
"\n",
"{ "
" "
" \n",
"const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0),\n",
" "
"vec4(-0.25, -0.25, 0.5, 1.0),\n",
" "
"vec4(0.25, 0.25, 0.5, 1.0)); \n",
" gl_Position = vertices[gl_VertexID]; \n",
"} "
" "
" \n"};
static const GLchar *FragmentShaderSource[] = {
"#version 450 core "
" "
"\n",
" "
" \n",
"out vec4 color; \n",
" "
" \n",
"void main(void) "
" "
"\n",
"{ "
" "
" \n",
" color = vec4(0.0, 0.8, 1.0, 1.0); \n",
"} "
" "
" \n"};
// Create and compile vertex shader.
VertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(VertexShader, 1, VertexShaderSource, NULL);
glCompileShader(VertexShader);
// Create and compile fragment shader.
FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(FragmentShader, 1, FragmentShaderSource, NULL);
glCompileShader(FragmentShader);
// Create program, attach shaders to it, and link it
Program = glCreateProgram();
glAttachShader(Program, VertexShader);
glAttachShader(Program, FragmentShader);
glLinkProgram(Program);
// Delete the shaders as the program has them now.
glDeleteShader(FragmentShader);
glDeleteShader(VertexShader);
return Program;
}
私は、Visual Studio 2015で働いています私は(私が思う)、いくつかのOpenGLを開発するすべてのライブラリを持っていますが、somethigは間違っています。私を助けてください。ちなみに、glCreateVertexArrays()
の機能はOpenGL 4.5以降でしかないと私は知っています。この本はOpenGL 4.5で説明されています。
初心者のための適切なチュートリアルがないので、私はすぐにクレイジーに行きます。これを学んだ人は非常に野心的な人々です。私はそれらの人々の前に弓をする。
'glDrawArrays'の直前で' glGetError() 'を呼び出し、' GL_NO_ERROR'以外の何かを返すかどうか確認してください。 – SurvivalMachine
あなたのコードでは描画するデータがありません。描画する頂点を含むバッファを作成する必要があります。そして、このバッファは 'glEnableVertexAttribArray'と' glVertexAttribPointer'を使ってVertexArrayObjectに_assign_する必要があります。 [open.gl:Drawing polygons](https://open.gl/drawing) –
@ t.niese Hmmをご覧ください。しかし、本書では、それらの追加の事柄については言及していません。 @ SurvivalMachine 'glGetError()'はゼロを返しました。 – Bora