#include "sb7.h"
#include <math.h>
GLint complie_shaders()
{
GLuint vertex_shader, fragment_shader, program;
//顶点着色器源代码
static const char* vertex_shader_source[] =
{
"#version 450 \n"
" \n"
"void main() \n"
"{ \n"
" gl_Position = vec4(0.0, 0.0, 0.5, 1.0); \n"
"}"
};
//片段着色器源代码
static const char* fragment_shader_source[] =
{
"#version 450 \n"
" \n"
"out vec4 color; \n"
" \n"
"void main() \n"
"{ \n"
" color = vec4(0.0, 0.8, 1.0, 1.0); \n"
"}"
};
//创建Shader
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
//将Shadder的源代码传递给Shader对象,以便保存该源代码的副本
glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
//编译着色器对象中的源代码
glCompileShader(vertex_shader);
//创建Shader
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
//将Shadder的源代码传递给Shader对象,以便保存该源代码的副本
glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
//编译着色器对象中的源代码
glCompileShader(fragment_shader);
//创建一个程序对象,我们可以将着色器对象附加到该对象
program = glCreateProgram();
//将着色器附加到程序对象中
glAttachShader(program, vertex_shader);
glAttachShader(program, fragment_shader);
//将所有附加到程序对象的着色器对象链接在一起
glLinkProgram(program);
//程序对象中已经有着色器对象了,可以将他们删除了
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
//将程序对象返回
return program;
}
class my_application : public sb7::application
{
public:
//完成设置任务
void startup()
{
//程序对象
rendering_program = complie_shaders();
//创建顶点数组对象
glCreateVertexArrays(1, &vertex_array_object);
//将对象绑定到上下文中去,让OpenGL知道这些对象
glBindVertexArray(vertex_array_object);
}
//清理函数
void shutdown()
{
//删除startup中创建的顶点数组对象
glDeleteVertexArrays(1, &vertex_array_object);
//删除程序对象
glDeleteProgram(rendering_program);
//删除程序对象中的顶点数组
glDeleteVertexArrays(1, &vertex_array_object);
}
//渲染函数
void render(double currentTime)
{
//颜色,随着时间而改变。分别是rgba,红绿蓝和透明度
const GLfloat color[] = { (float)sin(currentTime) * 0.5f + 0.5f,
(float)cos(currentTime) * 0.5f + 0.5f, 0.0f, 1.0f };
//清除第一个参数指定的缓存为第三个参数的值
glClearBufferfv(GL_COLOR, 0, color);
//使用程序对象
glUseProgram(rendering_program);
//向管线发送顶点
glDrawArrays(GL_POINTS, 0, 1);
//设置点的大小
glPointSize(64.f);
}
private:
GLuint rendering_program;
GLuint vertex_array_object;
};
// 函数实例运行
DECLARE_MAIN(my_application);
OpenGL超级宝典 绘制第一个点
于 2022-02-22 23:11:00 首次发布
这篇博客介绍了如何在OpenGL中编译和链接顶点及片段着色器,创建并使用程序对象进行渲染。内容包括设置顶点着色器和片段着色器的源代码,创建Shader对象,编译和链接着色器,以及在渲染过程中应用这些着色器。
摘要由CSDN通过智能技术生成