|
|
|
@ -27,18 +27,18 @@ namespace OpenGL {
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
constexpr char vertex_shader[] = R"(
|
|
|
|
|
#version 150 core
|
|
|
|
|
#version 430 core
|
|
|
|
|
|
|
|
|
|
in vec2 vert_position;
|
|
|
|
|
in vec2 vert_tex_coord;
|
|
|
|
|
out vec2 frag_tex_coord;
|
|
|
|
|
layout (location = 0) in vec2 vert_position;
|
|
|
|
|
layout (location = 1) in vec2 vert_tex_coord;
|
|
|
|
|
layout (location = 0) out vec2 frag_tex_coord;
|
|
|
|
|
|
|
|
|
|
// This is a truncated 3x3 matrix for 2D transformations:
|
|
|
|
|
// The upper-left 2x2 submatrix performs scaling/rotation/mirroring.
|
|
|
|
|
// The third column performs translation.
|
|
|
|
|
// The third row could be used for projection, which we don't need in 2D. It hence is assumed to
|
|
|
|
|
// implicitly be [0, 0, 1]
|
|
|
|
|
uniform mat3x2 modelview_matrix;
|
|
|
|
|
layout (location = 0) uniform mat3x2 modelview_matrix;
|
|
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
// Multiply input position by the rotscale part of the matrix and then manually translate by
|
|
|
|
@ -50,20 +50,22 @@ void main() {
|
|
|
|
|
)";
|
|
|
|
|
|
|
|
|
|
constexpr char fragment_shader[] = R"(
|
|
|
|
|
#version 150 core
|
|
|
|
|
#version 430 core
|
|
|
|
|
|
|
|
|
|
in vec2 frag_tex_coord;
|
|
|
|
|
out vec4 color;
|
|
|
|
|
layout (location = 0) in vec2 frag_tex_coord;
|
|
|
|
|
layout (location = 0) out vec4 color;
|
|
|
|
|
|
|
|
|
|
uniform sampler2D color_texture;
|
|
|
|
|
layout (binding = 0) uniform sampler2D color_texture;
|
|
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
// Swap RGBA -> ABGR so we don't have to do this on the CPU. This needs to change if we have to
|
|
|
|
|
// support more framebuffer pixel formats.
|
|
|
|
|
color = texture(color_texture, frag_tex_coord);
|
|
|
|
|
}
|
|
|
|
|
)";
|
|
|
|
|
|
|
|
|
|
constexpr GLint PositionLocation = 0;
|
|
|
|
|
constexpr GLint TexCoordLocation = 1;
|
|
|
|
|
constexpr GLint ModelViewMatrixLocation = 0;
|
|
|
|
|
|
|
|
|
|
/// Vertex structure that the drawn screen rectangles are composed of.
|
|
|
|
|
struct ScreenRectVertex {
|
|
|
|
|
ScreenRectVertex(GLfloat x, GLfloat y, GLfloat u, GLfloat v) {
|
|
|
|
@ -257,10 +259,6 @@ void RendererOpenGL::InitOpenGLObjects() {
|
|
|
|
|
state.draw.shader_program = shader.handle;
|
|
|
|
|
state.AllDirty();
|
|
|
|
|
state.Apply();
|
|
|
|
|
uniform_modelview_matrix = glGetUniformLocation(shader.handle, "modelview_matrix");
|
|
|
|
|
uniform_color_texture = glGetUniformLocation(shader.handle, "color_texture");
|
|
|
|
|
attrib_position = glGetAttribLocation(shader.handle, "vert_position");
|
|
|
|
|
attrib_tex_coord = glGetAttribLocation(shader.handle, "vert_tex_coord");
|
|
|
|
|
|
|
|
|
|
// Generate VBO handle for drawing
|
|
|
|
|
vertex_buffer.Create();
|
|
|
|
@ -271,14 +269,14 @@ void RendererOpenGL::InitOpenGLObjects() {
|
|
|
|
|
|
|
|
|
|
// Attach vertex data to VAO
|
|
|
|
|
glNamedBufferData(vertex_buffer.handle, sizeof(ScreenRectVertex) * 4, nullptr, GL_STREAM_DRAW);
|
|
|
|
|
glVertexArrayAttribFormat(vertex_array.handle, attrib_position, 2, GL_FLOAT, GL_FALSE,
|
|
|
|
|
glVertexArrayAttribFormat(vertex_array.handle, PositionLocation, 2, GL_FLOAT, GL_FALSE,
|
|
|
|
|
offsetof(ScreenRectVertex, position));
|
|
|
|
|
glVertexArrayAttribFormat(vertex_array.handle, attrib_tex_coord, 2, GL_FLOAT, GL_FALSE,
|
|
|
|
|
glVertexArrayAttribFormat(vertex_array.handle, TexCoordLocation, 2, GL_FLOAT, GL_FALSE,
|
|
|
|
|
offsetof(ScreenRectVertex, tex_coord));
|
|
|
|
|
glVertexArrayAttribBinding(vertex_array.handle, attrib_position, 0);
|
|
|
|
|
glVertexArrayAttribBinding(vertex_array.handle, attrib_tex_coord, 0);
|
|
|
|
|
glEnableVertexArrayAttrib(vertex_array.handle, attrib_position);
|
|
|
|
|
glEnableVertexArrayAttrib(vertex_array.handle, attrib_tex_coord);
|
|
|
|
|
glVertexArrayAttribBinding(vertex_array.handle, PositionLocation, 0);
|
|
|
|
|
glVertexArrayAttribBinding(vertex_array.handle, TexCoordLocation, 0);
|
|
|
|
|
glEnableVertexArrayAttrib(vertex_array.handle, PositionLocation);
|
|
|
|
|
glEnableVertexArrayAttrib(vertex_array.handle, TexCoordLocation);
|
|
|
|
|
glVertexArrayVertexBuffer(vertex_array.handle, 0, vertex_buffer.handle, 0,
|
|
|
|
|
sizeof(ScreenRectVertex));
|
|
|
|
|
|
|
|
|
@ -420,11 +418,7 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {
|
|
|
|
|
// Set projection matrix
|
|
|
|
|
std::array<GLfloat, 3 * 2> ortho_matrix =
|
|
|
|
|
MakeOrthographicMatrix((float)layout.width, (float)layout.height);
|
|
|
|
|
glUniformMatrix3x2fv(uniform_modelview_matrix, 1, GL_FALSE, ortho_matrix.data());
|
|
|
|
|
|
|
|
|
|
// Bind texture in Texture Unit 0
|
|
|
|
|
glActiveTexture(GL_TEXTURE0);
|
|
|
|
|
glUniform1i(uniform_color_texture, 0);
|
|
|
|
|
glUniformMatrix3x2fv(ModelViewMatrixLocation, 1, GL_FALSE, ortho_matrix.data());
|
|
|
|
|
|
|
|
|
|
DrawScreenTriangles(screen_info, (float)screen.left, (float)screen.top,
|
|
|
|
|
(float)screen.GetWidth(), (float)screen.GetHeight());
|
|
|
|
|