지금 저는 OpenGL을 배우고 있습니다. 나는 OpenGL Superbible이라는 책을 샀다. 하지만 제대로 환경을 구성 할 수 없었습니다. 나는 GLFW 3.2를 윈도우 툴킷 (그것이 무엇인지 불리우면)과 GLEW 2.0으로 사용합니다.glCreateVertexArrays를 사용할 때 검은 화면이 나타납니다.
화면에 그릴 때 셰이더를 컴파일하고 사용하려고합니다. 책에 따르면 이것은 화면에 삼각형을 그려야합니다. 그러나 그렇지 않습니다. 대신, glClearColor
에 의해 설정된 명확한 배경색을 보여줍니다. 난 비주얼 스튜디오 2015에서 작업하고
#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;
}
좀 OpenGL은을 (내가 생각하는) 개발에 모든 라이브러리를 가지고 있지만, somethig에 잘못된 것입니다 :
이
은 Code입니다. 도와주세요. 그건 그렇고,glCreateVertexArrays()
함수는 OpenGL 4.5 이상에서만 사용 가능합니다.이 책은 OpenGL 4.5에서 설명 되었기 때문에 알고 있습니다.
초보자를위한 적절한 튜토리얼이 없기 때문에 곧 갈 것입니다. 이것을 배운 사람들은 매우 야심 찬 사람들입니다. 나는 그 사람들 앞에 굴복한다.
'glDrawArrays' 바로 전에'glGetError()'를 호출하고'GL_NO_ERROR' 이외의 것을 반환하는지 확인하십시오. – SurvivalMachine
코드에서 그릴 데이터가 없습니다. 그리려는 정점이 포함 된 버퍼를 만들어야합니다. 그리고이 버퍼는'glEnableVertexAttribArray'와'glVertexAttribPointer'를 사용하여 VertexArrayObject에 할당해야합니다. [open.gl : 다각형 그리기] (https://open.gl/drawing) –
@ t.niese 흠. 그러나이 책에서는 그 추가적인 것을 말하지 않습니다. @ SurvivalMachine'glGetError()'가 0을 반환했습니다. – Bora