着色器
着色器分为顶点着色器和片段着色器,片段着色器再传给帧缓存
#define _CRT_SECURE_NO_WARNINGS
#include "sb7.h"
class my_application : public sb7::application
{
public:
GLuint compile_shaders(void)
{
GLuint vertex_shader; //创建顶点着色器
GLuint fragment_shader; //创建片段着色器
GLuint program;
static const GLchar* vertex_shader_source[] =
{
"#version 450 core \n"
" \n"
"void main(void) \n"
"{ \n"
" gl_Position = vec4(0.0, 0.0, 0.5, 1.0); \n"
"} \n"
};
//static const GLchar* vertex_shader_source[] =
//{
// "#version 450 core \n"
// " \n"
// "void main(void) \n"
// "{ \n"
// " const vec4 vertices[] = vec4[](vec4(0.25, -0.25, 0.5, 1.0), \n"
// " vec4(-0.25, -0.25, 0.5, 1.0), \n"
// " vec4(0.25, 0.25, 0.5, 1.0)); \n"
// " gl_Position = vertices[gl_VertexID]; \n"
// "} \n"
//};
//static const char* vertex_shader_source[] =
//{
// "#version 420 core \n"
// " \n"
// "void main(void) \n"
// "{ \n"
// " const vec4 vertices[] = vec4[](vec4( 0.25, -0.25, 0.5, 1.0), \n"
// " vec4(-0.25, -0.25, 0.5, 1.0), \n"
// " vec4( 0.25, 0.25, 0.5, 1.0)); \n"
// " \n"
// " gl_Position = vertices[gl_VertexID]; \n"
// "} \n"
//};
static const GLchar* fragment_shader_source[] =
{
"#version 450 core \n"
" \n"
"out vec4 color; \n"
" \n"
"void main(void) \n"
"{ \n"
" color = vec4(0.0, 0.8, 1.0, 1.0); \n"
"} \n"
};
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
glCompileShader(vertex_shader);
fragment_shader = glCreateShader(GL_FRAGMENT_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;
}
void startup()
{
rendering_program = compile_shaders();
glCreateVertexArrays(1, &vertex_array_object);
glBindVertexArray(vertex_array_object);
}
void shutdown()
{
glDeleteVertexArrays(1, &vertex_array_object);
glDeleteProgram(rendering_program);
glDeleteVertexArrays(1, &vertex_array_object);
}
void render(double currentTime)
{
//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);
const GLfloat color[] = {0.0f, 0.2f, 0.0f, 1.0f};
glClearBufferfv(GL_COLOR, 0, color);
glUseProgram(rendering_program);
//glPointSize(40.0f);
glDrawArrays(GL_POINTS, 0, 1);
//glDrawArrays(GL_TRIANGLES, 0, 3);
}
private:
GLuint rendering_program;
GLuint vertex_array_object;
};
DECLARE_MAIN(my_application);
void glClearBufferfv(GLenum buffer, GLint drawBuffer, const GLfloat* value); //清除第一个参数指定的缓存(GL_COLOR)为其第三个参数的指定值
glCreateShader() 创建一个空的着色器对象,可随时接收源代码并进行编译
glShaderSource() 将着色器源代码传递给着色器对象,以便保留该源代码的副本
glCompileShader() 将着色器对象中包含的任何源代码进行编译
glCreateProgram() 创建一个程序对象,我们可将着色器对象附加到该对象
glAttachShader() 将一个着色器对象附加到一个程序对象中
glLinkProgram() 将所有附加到程序对象的着色器对象链接到一起
glDeleteShader() 删除一个着色器对象。一旦着色器链接到一个程序对象,程序将包含二进制代码,并不再需要着色器