The OpenGL shader demo:
// file demo.c
#include <GL/glut.h>
char *vstr = "#version 330 core\n"
"layout(location=0) in vec4 vPosition;\n"
"void main()\n"
"{\n"
" gl_Position = vPosition;\n"
"}\n";
char *fstr = "#version 330 core\n"
"out vec4 fColor;\n"
"void main()\n"
"{\n"
" fColor = vec4(0.0, 0.0, 1.0, 1.0);\n"
"}\n";
GLuint LoadShaders(GLenum type, char *str)
{
GLuint shader = glCreateShader(type);
printf("%s\n", str);
glShaderSource( shader, 1, &str, NULL );
glCompileShader( shader );
GLint compiled;
glGetShaderiv( shader, GL_COMPILE_STATUS, &compiled );
if ( !compiled ) {
GLsizei len;
glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &len );
GLchar* log = malloc(len + 1);
glGetShaderInfoLog( shader, len, &len, log );
printf("Shader compilation failed: %s\n", log);
free(log);
return 0;
}
return shader;
}
void init(void)
{
int vao;
int buffer;
int vPosition;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLfloat vertices[6][2] = {
{ -0.90, -0.90 }, // Triangle 1
{ 0.85, -0.90 },
{ -0.90, 0.85 },
{ 0.90, -0.85 }, // Triangle 2
{ 0.90, 0.90 },
{ -0.85, 0.90 }
};
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
GLuint program = glCreateProgram();
if (program == 0) {
printf("Error to create program\n");
return ;
}
GLuint shader;
shader = LoadShaders(GL_VERTEX_SHADER, vstr);
glAttachShader(program, shader);
shader = LoadShaders(GL_FRAGMENT_SHADER, fstr);
glAttachShader(program, shader);
glLinkProgram(program);
glUseProgram(program);
glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(vPosition);
}
void display(void)
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 12);
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_ALPHA);
glutInitWindowSize(800, 600);
glutCreateWindow("Simple");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Compiler with:
gcc demo.c -lGL -lglut
Then run a.out show as:

网友评论