18 m_context = std::make_unique<EGLContext_>();
20 m_context = std::make_unique<WGLContext>();
22 m_context = std::make_unique<NSGLContext>();
25 m_context->initialize(nativeWindowHandle);
28 gl.Enable(GL_DEPTH_TEST);
29 gl.ClearColor(clearColor.
r, clearColor.
g, clearColor.
b, clearColor.
a);
31 gl.GenBuffers(1, &
m_ubo);
32 gl.BindBuffer(GL_UNIFORM_BUFFER,
m_ubo);
33 gl.BufferData(GL_UNIFORM_BUFFER,
sizeof(glm::mat4),
nullptr, GL_DYNAMIC_DRAW);
34 gl.BindBufferBase(GL_UNIFORM_BUFFER, 0,
m_ubo);
35 gl.BindBuffer(GL_UNIFORM_BUFFER, 0);
40 const auto &gl = m_context->gl;
41 gl.Viewport(0, 0, windowSize.
width, windowSize.
height);
42 gl.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
44 gl.UseProgram(m_programs.at(shaderId));
45 gl.BindBuffer(GL_UNIFORM_BUFFER, m_ubo);
46 gl.BufferSubData(GL_UNIFORM_BUFFER, 0,
sizeof(glm::mat4), &mvp);
49 gl.BindVertexArray(m_mesh.vao);
50 gl.DrawArrays(GL_TRIANGLES, 0, m_mesh.vertexCount);
51 gl.BindVertexArray(0);
53 m_context->swapBuffers();
58 const auto &gl = m_context->gl;
59 const GLuint program = gl.CreateProgram();
61 const GLuint vs = createGLShader(GL_VERTEX_SHADER, vertex, gl);
62 const GLuint fs = createGLShader(GL_FRAGMENT_SHADER, fragment, gl);
64 gl.AttachShader(program, vs);
65 gl.AttachShader(program, fs);
66 gl.LinkProgram(program);
69 gl.GetProgramiv(program, GL_LINK_STATUS, &success);
73 gl.GetProgramInfoLog(program, 512,
nullptr, log);
74 throw std::runtime_error(log);
80 m_programs[id] = program;
85 const auto &gl = m_context->gl;
87 mesh.
vertexCount =
static_cast<GLsizei
>(vertices.size() / 5);
89 gl.GenVertexArrays(1, &mesh.vao);
90 gl.GenBuffers(1, &mesh.vbo);
92 gl.BindVertexArray(mesh.vao);
93 gl.BindBuffer(GL_ARRAY_BUFFER, mesh.vbo);
94 gl.BufferData(GL_ARRAY_BUFFER, vertices.size() *
sizeof(float), vertices.data(), GL_STATIC_DRAW);
96 gl.VertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 *
sizeof(
float),
static_cast<void *
>(0));
97 gl.EnableVertexAttribArray(0);
99 gl.VertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 *
sizeof(
float),
reinterpret_cast<void *
>(3 *
sizeof(float)));
100 gl.EnableVertexAttribArray(1);
102 gl.BindBuffer(GL_ARRAY_BUFFER, 0);
103 gl.BindVertexArray(0);
This file contains the EGLContext_ class declaration.
This file contains the NSGLContext class declaration.
This file contains the WGLContext class declaration.
void draw(const WindowSize &windowSize, const ShaderID &shaderId, glm::mat4 mvp) override
Draw the scene using the specified shader and window size.
void createPipeline(const ShaderID &id, const ShaderIRModule &vertex, const ShaderIRModule &fragment) override
Create a rendering pipeline with vertex and fragment shaders.