102 lines
3.0 KiB
C++
102 lines
3.0 KiB
C++
//
|
|
// Created by misaki on 2026/6/23.
|
|
//
|
|
|
|
#pragma once
|
|
#include "IRenderContext.hpp"
|
|
#include "LAppOpenGL.hpp"
|
|
|
|
class GLRenderContext final : public IRenderContext {
|
|
public:
|
|
void Clear(float r, float g, float b, float a) override {
|
|
glClearColor(r, g, b, a);
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
}
|
|
|
|
void ClearDepth(float depth) override {
|
|
LAPP_GL_CLEAR_DEPTH(depth);
|
|
}
|
|
|
|
void SetViewport(int x, int y, int w, int h) override {
|
|
glViewport(x, y, w, h);
|
|
}
|
|
|
|
uintptr_t CreateShaderProgram() override {
|
|
return CompileShader();
|
|
}
|
|
|
|
uintptr_t GetShaderProgram() const override {
|
|
return _programId;
|
|
}
|
|
|
|
void InitializeGLState() override {
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
glEnable(GL_BLEND);
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
}
|
|
|
|
private:
|
|
GLuint _programId = 0;
|
|
|
|
GLuint CompileShader() {
|
|
if (_programId) return _programId;
|
|
|
|
#if defined(QT_OPENGL_ES_2) || defined(QT_OPENGL_ES_3) || defined(EMBEDDED_LINUX)
|
|
const char* vertexShader =
|
|
"#version 100\n"
|
|
"attribute vec3 position;\n"
|
|
"attribute vec2 uv;\n"
|
|
"varying vec2 vuv;\n"
|
|
"void main() {\n"
|
|
" gl_Position = vec4(position, 1.0);\n"
|
|
" vuv = uv;\n"
|
|
"}\n";
|
|
const char* fragmentShader =
|
|
"#version 100\n"
|
|
"precision mediump float;\n"
|
|
"varying vec2 vuv;\n"
|
|
"uniform sampler2D texture;\n"
|
|
"uniform vec4 baseColor;\n"
|
|
"void main() {\n"
|
|
" gl_FragColor = texture2D(texture, vuv) * baseColor;\n"
|
|
"}\n";
|
|
#else
|
|
const char* vertexShader =
|
|
"#version 120\n"
|
|
"attribute vec3 position;\n"
|
|
"attribute vec2 uv;\n"
|
|
"varying vec2 vuv;\n"
|
|
"void main(void) {\n"
|
|
" gl_Position = vec4(position, 1.0);\n"
|
|
" vuv = uv;\n"
|
|
"}\n";
|
|
const char* fragmentShader =
|
|
"#version 120\n"
|
|
"varying vec2 vuv;\n"
|
|
"uniform sampler2D texture;\n"
|
|
"uniform vec4 baseColor;\n"
|
|
"void main(void) {\n"
|
|
" gl_FragColor = texture2D(texture, vuv) * baseColor;\n"
|
|
"}\n";
|
|
#endif
|
|
|
|
GLuint vertId = glCreateShader(GL_VERTEX_SHADER);
|
|
glShaderSource(vertId, 1, &vertexShader, nullptr);
|
|
glCompileShader(vertId);
|
|
|
|
GLuint fragId = glCreateShader(GL_FRAGMENT_SHADER);
|
|
glShaderSource(fragId, 1, &fragmentShader, nullptr);
|
|
glCompileShader(fragId);
|
|
|
|
_programId = glCreateProgram();
|
|
glAttachShader(_programId, vertId);
|
|
glAttachShader(_programId, fragId);
|
|
glLinkProgram(_programId);
|
|
glUseProgram(_programId);
|
|
|
|
glDeleteShader(vertId);
|
|
glDeleteShader(fragId);
|
|
return _programId;
|
|
}
|
|
}; |