simple cyan triangle
This commit is contained in:
@@ -62,6 +62,7 @@ public:
|
|||||||
|
|
||||||
class CosetsWindow : public Window {
|
class CosetsWindow : public Window {
|
||||||
GLint program;
|
GLint program;
|
||||||
|
GLuint vao;
|
||||||
|
|
||||||
GLint build_shader(GLenum type, const string &name, const string &src) {
|
GLint build_shader(GLenum type, const string &name, const string &src) {
|
||||||
const char *c_str = src.c_str();
|
const char *c_str = src.c_str();
|
||||||
@@ -78,36 +79,73 @@ class CosetsWindow : public Window {
|
|||||||
char log[log_len];
|
char log[log_len];
|
||||||
glGetShaderInfoLog(s, log_len, nullptr, log);
|
glGetShaderInfoLog(s, log_len, nullptr, log);
|
||||||
fprintf(stderr, "SHADER LOG (%s):\n%s", name.c_str(), log);
|
fprintf(stderr, "SHADER LOG (%s):\n%s", name.c_str(), log);
|
||||||
|
|
||||||
|
glDeleteShader(s);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLint build_program(const string &name, GLint vs, GLint fs) {
|
||||||
|
GLint p = glCreateProgram();
|
||||||
|
glAttachShader(p, vs);
|
||||||
|
glAttachShader(p, fs);
|
||||||
|
glLinkProgram(p);
|
||||||
|
|
||||||
|
GLint stat;
|
||||||
|
glGetProgramiv(p, GL_LINK_STATUS, &stat);
|
||||||
|
if (!stat) {
|
||||||
|
GLint log_len;
|
||||||
|
glGetShaderiv(p, GL_INFO_LOG_LENGTH, &log_len);
|
||||||
|
char log[log_len];
|
||||||
|
glGetProgramInfoLog(p, log_len, nullptr, log);
|
||||||
|
fprintf(stderr, "SHADER LOG (%s):\n%s", name.c_str(), log);
|
||||||
|
|
||||||
|
glDeleteProgram(p);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void init() override {
|
void init() override {
|
||||||
auto vs = build_shader(GL_VERTEX_SHADER, "vertex",
|
auto vs = build_shader(GL_VERTEX_SHADER, "vertex",
|
||||||
"#version 400\n"
|
"#version 400\n"
|
||||||
""
|
|
||||||
"void main(){"
|
"void main(){"
|
||||||
" int"
|
" float x = gl_VertexID % 2;"
|
||||||
|
" float y = gl_VertexID / 2;"
|
||||||
|
" gl_Position = vec4(x, y, 0, 1);"
|
||||||
"}");
|
"}");
|
||||||
|
|
||||||
auto fs = build_shader(GL_FRAGMENT_SHADER, "fragment",
|
auto fs = build_shader(GL_FRAGMENT_SHADER, "fragment",
|
||||||
"#version 400\n"
|
"#version 400\n"
|
||||||
""
|
|
||||||
"void main(){"
|
"void main(){"
|
||||||
" int"
|
" gl_FragColor = vec4(0, 1, 1, 0);"
|
||||||
"}"
|
"}"
|
||||||
);
|
);
|
||||||
|
|
||||||
program = glCreateProgram();
|
program = build_program("main", vs, fs);
|
||||||
glAttachShader(program, vs);
|
|
||||||
glAttachShader(program, fs);
|
glGenVertexArrays(1, &vao);
|
||||||
glLinkProgram(program);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void render() override {
|
void render() override {
|
||||||
|
int w, h;
|
||||||
|
getBounds(w, h);
|
||||||
|
glViewport(0, 0, w, h);
|
||||||
|
|
||||||
|
glBindVertexArray(vao);
|
||||||
|
glUseProgram(program);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
|
||||||
|
swapbuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void deinit() override {
|
||||||
|
glDeleteProgram(program);
|
||||||
|
glDeleteVertexArrays(1, &vao);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user