在开始本篇教程之前,先介绍一篇opengl中文教程
opengl中文教程网站
下面就开始本次教程
glfw下载
下载glew
GLEW: The OpenGL Extension Wrangler Library
建一个文件夹,把上面下载的两个包都放到这个文件夹,并解压
下面开始打开vs,新建一个项目
opengl32.lib
glfw3.lib
glew32s.lib
下面代码是打开一个窗口
// createWindow.cpp: 定义控制台应用程序的入口点。
//
#include <iostream>>
#include "stdafx.h"
#define GLEW_STATIC
#include <GL\glew.h>
#include <GLFW\glfw3.h>
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//开窗
GLFWwindow * window = glfwCreateWindow(800,600,"learnopengl",NULL, NULL);
if (window == NULL) {
printf("fail create window");
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
//
if (glewInit() != GLEW_OK) {
printf("init glew fail");
glfwTerminate();
}
glViewport(0, 0, 800, 600);
while (!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
printf("hello hunk");
getchar();
return 0;
}
效果如下:
下面开始画一个随着时间不断变化颜色的三角形
// createWindow.cpp: 定义控制台应用程序的入口点。
//
#include <iostream>>
#include "stdafx.h"
#define GLEW_STATIC
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include<thread>
int main()
{
float verticles[] = {
-1,1,0,
1,1,0,
0,0.5f,0,
0,0.5f,0,
-1,0,0,
1,0,0
};
float verticles1[] = {
-1.0f,-1.0f,0,
1,0,0,
1.0f,-1.0f,0,
0,1,0,
0,-0.0f,0,
0,0,1
};
const char *vertexShaderSource = "#version 330 core \n"
"layout (location = 0) in vec3 aPos; \n"
"layout (location = 2) in vec3 myColor; \n"
"out vec4 vertexxColor; \n"
"void main() \n"
"{ \n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); \n"
" vertexxColor = vec4(myColor.x,myColor.y,myColor.z, 1.0); \n"
"} \n";
const char* fragmentShaderSource =
"#version 330 core \n"
"out vec4 FragColor; \n"
"in vec4 vertexxColor; \n"
"void main() \n"
"{ \n"
" FragColor = vertexxColor; \n"
"} \n";
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//开窗
GLFWwindow * window = glfwCreateWindow(800,600,"learnopengl",NULL, NULL);
if (window == NULL) {
printf("fail create window");
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
//
if (glewInit() != GLEW_OK) {
printf("init glew fail");
glfwTerminate();
}
glViewport(0, 0, 800, 600);
unsigned int vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(verticles), verticles, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, NULL);
unsigned int vbo1;
glGenBuffers(1, &vbo1);
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glBufferData(GL_ARRAY_BUFFER, sizeof(verticles1), verticles1, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, NULL);
unsigned int vao;
glGenVertexArrays(1, &vao);
unsigned int veticleShader;
veticleShader=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(veticleShader, 1, &vertexShaderSource,NULL);
glCompileShader(veticleShader);
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, veticleShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
//链接后就可以删除两个shader
glDe...(veticleShader);
glDe...(fragmentShader);
while (!glfwWindowShouldClose(window))
{
//清屏
glClearColor(0.2f,0.3f,0.3f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//我准备了一个vao
glBindVertexArray(vao);
//画vbo里的内容,因此绑定vbo
glBindBuffer(GL_ARRAY_BUFFER, vbo);
//按取出数规则,将从vbo里拷贝到vao对应的槽位(pointer)上,注意我的用词是拷贝
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//这里故意少写一个glVertexAttribPointer,直接enable,发现直接用了上次vao保存的数据
glEnableVertexAttribArray(2); //启用后,定点着色器(location = 2)对应变量才也可以从vao对应pointer取数据
//开始画
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(0);
glEnableVertexAttribArray(2);
//画vbo1里的内容,因此绑定vbo1
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
//按取出数规则,将从vbo里拷贝到vao对应的槽位(pointer)上,注意我的用词是拷贝
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//按取出数规则,将从vbo里拷贝到vao对应的槽位(pointer)上,注意我的用词是拷贝
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3*sizeof(float)));
glEnableVertexAttribArray(2);
//开始画
glDrawArrays(GL_TRIANGLES, 0, 3);
//绘制完后禁用
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(2);
float timeValue = glfwGetTime();
float greenValue = (sin(timeValue) / 2.0f) + 0.5f;
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
glUseProgram(shaderProgram);
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
printf("hello hunk");
getchar();
return 0;
}
运行后结果画面
FR:徐海涛(hunkxu)