管线

#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 char* vertex_shader_source[] =
		{
			"#version 450 core                                                          \n"
			"layout (location = 0) in vec4 offset;										\n"
			"layout (location = 1) in vec4 color; \n"
			"out vec4 ot_color; \n"
			"                                                                           \n"
			"void main(void)                                                            \n"
			"{                                                                          \n"
			"    const vec4 vertices[3] = vec4[3](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] + offset;                          \n"
			"    ot_color = color; \n"
			"}                                                                          \n"
		};
		static const GLchar* fragment_shader_source[] =
		{
			"#version 450 core								\n"
			"												\n"
			"in vec4 ot_color; \n"
			"out vec4 color;								\n"
			"												\n"
			"void main(void)								\n"
			"{												\n"
			"	color = ot_color;			\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);

		GLfloat attrib[] = {(float)sin(currentTime) * 0.5f,
							(float)cos(currentTime) *0.6f,
							0.0f, 0.0f};
		//glVertexAttrib4fv(0, attrib);

		glVertexAttrib4fv(1, attrib);

		glDrawArrays(GL_TRIANGLES, 0, 3);
	}
private:
	GLuint rendering_program;
	GLuint vertex_array_object;
};

DECLARE_MAIN(my_application);
顶点着色器是必需的,顶点获取自动获输入。通过in获取,通过out输出
Table of Contents