着色器

着色器分为顶点着色器和片段着色器,片段着色器再传给帧缓存

#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()  删除一个着色器对象。一旦着色器链接到一个程序对象,程序将包含二进制代码,并不再需要着色器
Table of Contents