OpenGl是怎么通过顶点数组来画图的,就像是画一个正方体,颜色数组有八个元素,是对应八个定顶点吗?
vertex3 pt1[8] = { {0,0,0}, {0,1,0}, {1, 0, 0},{1, 1, 0},{0, 0, 1},{0, 1, 1},{1, 0, 1},{1, 1, 1} };
color3 col1[8] = { {1,0,0},{1,0,0},{0,0,1},{0,0,1},{1,0,0},{1,0,0},{0,0,1},{0,0,1} };
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_INT,0,pt1);
glColorPointer(3, GL_FLOAT, 0,col1);
GLuint vertIndex[] = { 6, 2, 3, 7 ,5, 1, 0, 4 ,7, 3, 1, 5 ,4, 0, 2, 6,2, 0, 1, 3 ,7, 5, 4, 6 };
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, vertIndex);
你想实现8种颜色渐变吗?
不知道你这个问题是否已经解决, 如果还没有解决的话:看可不可以在不参考任何文章和代码的情况下,仅通过修改之前生成的三角形的代码,生成如下图形:
参考代码:
#pragma comment(lib,"glew32.lib")
#include<iostream>
#include<opengl/glew.h>
#define GLEW_STATIC
#include<GLFW/glfw3.h>
#include<opengl/freeglut.h>
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
const GLuint WIDTH = 800, HEIGHT = 600;
// Shaders
const GLchar* VShader =
"#version 330 core\n"
"layout (location = 0) in vec3 position;\n"
"void main()\n"
"{\n"
"gl_Position = vec4(position.x, position.y, position.z, 1.0);\n"
"}\0";
const GLchar* FShaderY =
"#version 330 core\n"
"out vec4 color;\n"
"void main()\n"
"{\n"
"color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n\0";
const GLchar* FShaderB =
"#version 330 core\n"
"out vec4 color;\n"
"void main()\n"
"{\n"
"color = vec4(0.1f, 0.1f, 1.0f, 1.0f);\n"
"}\n\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* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
glfwMakeContextCurrent(window);
glfwSetKeyCallback(window, key_callback);
glewExperimental = GL_TRUE;
glewInit();
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &VShader, NULL);
glCompileShader(vertexShader);
GLuint fShaderY = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fShaderY, 1, &FShaderY, NULL);
glCompileShader(fShaderY);
GLuint fShaderB = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fShaderB, 1, &FShaderB, NULL);
glCompileShader(fShaderB);
GLuint shaderYellow = glCreateProgram();
GLuint shaderBlue = glCreateProgram();
glAttachShader(shaderYellow, vertexShader);
glAttachShader(shaderYellow, fShaderY);
glLinkProgram(shaderYellow);
glAttachShader(shaderBlue, vertexShader);
glAttachShader(shaderBlue, fShaderB);
glLinkProgram(shaderBlue);
glDeleteShader(vertexShader);
glDeleteShader(fShaderY);
glDeleteShader(fShaderB);
GLfloat trangleY[] =
{
-0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,
0.0f, 0.0f, 0.0f
};
GLfloat trangleB[] =
{
0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
0.0f, 0.0f, 0.0f
};
GLuint VBO[2], VAO[2];
glGenVertexArrays(2, VAO);
glGenBuffers(2, VBO);
glBindVertexArray(VAO[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(trangleY), trangleY, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glBindVertexArray(VAO[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(trangleB), trangleB, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderYellow);
glBindVertexArray(VAO[0]);
glDrawArrays(GL_TRIANGLES, 0, 3);
glUseProgram(shaderBlue);
glBindVertexArray(VAO[1]);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glfwSwapBuffers(window);
}
glDeleteVertexArrays(2, VAO);
glDeleteBuffers(2, VBO);
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);
}
参考文献:
https://learnopengl.com/#!Getting-started/OpenGL