Openglで三角形を描き、shaderで色を変えます

34438 ワード

/*
glew.h           
typedef unsigned int GLenum;
typedef unsigned int GLbitfield;
typedef unsigned int GLuint;
typedef int GLint;
typedef int GLsizei;
typedef unsigned char GLboolean;
typedef signed char GLbyte;
typedef short GLshort;
typedef unsigned char GLubyte;
typedef unsigned short GLushort;
typedef unsigned long GLulong;
typedef float GLfloat;
typedef float GLclampf;
typedef double GLdouble;
typedef double GLclampd;
typedef void GLvoid;
 */

#include 

#define GLEW_STATIC

#include 
#include 

void key_callback(GLFWwindow *windows, int key, int scancode, int actin, int mode);

const GLuint WIDTH = 800, HEIGHT = 600;

//Shaders
const GLchar *vertexShaderSource = "#version 330 core
" "
" "layout (location = 0) in vec3 position;
" "
" "void main()
" "{
" " gl_Position = vec4(position.x, position.y, position.z, 1.0);
" "}"; const GLchar *fragmentShaderSource = "#version 330 core
" "out vec4 color;
" "void main()
" "{
" "color = vec4(1.0f, 0.5f, 0.2f, 1.0f);
" "}
\0
"; const GLchar* fragmentShaderSource2 = "#version 330 core
" "out vec4 color;
" "void main()
" "{
" "color = vec4(1.0f, 1.0f, 0.0f, 1.0f); // The color yellow
" "}
\0
"; int main() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); // GLFWwindow , , , , , // null, nullptr c++11 GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "OpenGL", nullptr, nullptr); glfwMakeContextCurrent(window); // GLFW glewExperimental = GL_TRUE;// true glew opengl glewInit();// glew // viewport dpi int width, height; glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height); // vertexShader,glShaderSource shader shader , ID //glCompileShader . GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); // Shader GLint success; GLchar infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED
" << infoLog << std::endl; } // Fragment shader , GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); // glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED
" << infoLog << std::endl; } // Fragment shader , GLuint fragmentShader2 = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader2, 1, &fragmentShaderSource2, NULL); glCompileShader(fragmentShader2); // Check for compile time errors glGetShaderiv(fragmentShader2, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragmentShader2, 512, NULL, infoLog); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED
" << infoLog << std::endl; } // Link shaders GLuint shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); // link glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED
" << infoLog << std::endl; } GLuint shaderProgram2 = glCreateProgram(); glAttachShader(shaderProgram2, vertexShader); glAttachShader(shaderProgram2, fragmentShader2); glLinkProgram(shaderProgram2); // link glGetProgramiv(shaderProgram2, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shaderProgram2, 512, NULL, infoLog); std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED
" << infoLog << std::endl; } // Shader glDeleteShader(vertexShader); glDeleteShader(fragmentShader); glDeleteShader(fragmentShader2); // GLfloat vertices1[] = { 0.0f, -0.5f, 0.0f, 1.0f, -0.5f, 0.0f, 0.5f, 0.5f, 0.0f, }; GLfloat vertices2[] = { 0.0f, -0.5f, 0.0f, -1.0, -0.5f, 0.0f, -0.5f, 0.5f, 0.0f }; GLuint VBOs[2], VAOs[2]; // glGenVertexArrays(1, &VAOs[0]); glGenBuffers(1, &VBOs[0]); glBindVertexArray(VAOs[0]); glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]); // VBO glBufferData(GL_ARRAY_BUFFER, sizeof(vertices1), vertices1, GL_STATIC_DRAW);// , glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid *) 0);// , location, glEnableVertexAttribArray(0); // location 0 , glBindBuffer(GL_ARRAY_BUFFER, 0);// VBO glBindVertexArray(0);// VAO // glGenVertexArrays(1, &VAOs[1]); glGenBuffers(1, &VBOs[1]); glBindVertexArray(VAOs[1]); glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]); // VBO glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STATIC_DRAW);// , glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid *) 0);// , location, glEnableVertexAttribArray(0); // location 0 , glBindBuffer(GL_ARRAY_BUFFER, 0);// VBO glBindVertexArray(0);// VAO // while (!glfwWindowShouldClose(window)) { // glfwPollEvents(); // glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // shaderProgram glUseProgram(shaderProgram); glBindVertexArray(VAOs[0]); // glDrawArrays(GL_TRIANGLES, 0, 3); glUseProgram(shaderProgram2); glBindVertexArray(VAOs[1]); // glDrawArrays(GL_TRIANGLES, 0, 3); glBindVertexArray(0); // glfwSwapBuffers(window); } glDeleteVertexArrays(2, VAOs); glDeleteBuffers(2, VBOs); glfwTerminate(); return 0; } void key_callback(GLFWwindow *window, int key, int scancode, int action, int mode) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); }
   learnopengl