#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
using namespace std;
#define numVAOs 1
//unsigned int宏定义为了GLuint,只是一种无关简写
GLuint renderingProgram;
GLuint vao[numVAOs];
GLuint createShaderProgram() {
const char *vshaderSource =
"#version 430 \n"
"void main(void) \n"
"{ gl_Position = vec4(0.0, 0.0, 0.0, 1.0); }";
const char *fshaderSource =
"#version 430 \n"
"out vec4 color; \n"
"void main(void) \n"
"{ color = vec4(0.0, 0.0, 1.0, 1.0); }";
//调用两次glCreateShader函数,创建GL_VERTEX_SHADER(顶点着色器),GL_FRAGMENT_SHADER(片段着色器)。
GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);
//创建程序
GLuint vfprogram = glCreateProgram();
//glShaderSource将GLSL代码从字符串载入到空着色器对象中
glShaderSource(vShader, 1, &vshaderSource, NULL);
glShaderSource(fShader, 1, &fshaderSource, NULL);
//glCompileShader编译各着色器
glCompileShader(vShader);
glCompileShader(fShader);
//glAttachShader将着色器加入程序对象
glAttachShader(vfprogram, vShader);
glAttachShader(vfprogram, fShader);
//请求GLSL编译器
glLinkProgram(vfprogram);
return vfprogram;
}
void init(GLFWwindow* window) {
renderingProgram = createShaderProgram();
glGenVertexArrays(numVAOs, vao);
glBindVertexArray(vao[0]);
}
void display(GLFWwindow* window, double currentTime) {
//glUseProgram将着色器的程序载入GPU
glUseProgram(renderingProgram);
glPointSize(30.0f);
//启动管线处理过程
glDrawArrays(GL_POINTS, 0, 1);
}
int main(void) {
if (!glfwInit()) { exit(EXIT_FAILURE); }
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
GLFWwindow* window = glfwCreateWindow(600, 600, "着色器使用", NULL, NULL);
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); }
glfwSwapInterval(1);
init(window);
while (!glfwWindowShouldClose(window)) {
display(window, glfwGetTime());//glfwGetTime()返回GLFW初始化之后经过的时间
glfwSwapBuffers(window);//绘制屏幕
glfwPollEvents();//处理窗口相关事件
}
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
}
使用OpenGL着色器画一个点
于 2024-01-06 10:03:26 首次发布