Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/application/StarRenderer_opengl20.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-23 23:01:25 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-23 23:01:25 +1000
commit6832c10ed5482530b4a423a78700b279fc73212a (patch)
treeb26c485a105659936b5378379a773365a6da5bf8 /source/application/StarRenderer_opengl20.cpp
parent4328119e1c1f8578a92977a943a793b2ac9032e0 (diff)
Split shaders into their own files
some unrelated directives thing too
Diffstat (limited to 'source/application/StarRenderer_opengl20.cpp')
-rw-r--r--source/application/StarRenderer_opengl20.cpp182
1 files changed, 89 insertions, 93 deletions
diff --git a/source/application/StarRenderer_opengl20.cpp b/source/application/StarRenderer_opengl20.cpp
index bc58ee1..eea4e9f 100644
--- a/source/application/StarRenderer_opengl20.cpp
+++ b/source/application/StarRenderer_opengl20.cpp
@@ -7,71 +7,67 @@ namespace Star {
size_t const MultiTextureCount = 4;
-char const* DefaultEffectConfig = R"JSON(
- {
- "vertexShader" : "
- #version 110
-
- uniform vec2 textureSize0;
- uniform vec2 textureSize1;
- uniform vec2 textureSize2;
- uniform vec2 textureSize3;
- uniform vec2 screenSize;
- uniform mat3 vertexTransform;
-
- attribute vec2 vertexPosition;
- attribute vec2 vertexTextureCoordinate;
- attribute float vertexTextureIndex;
- attribute vec4 vertexColor;
- attribute float vertexParam1;
-
- varying vec2 fragmentTextureCoordinate;
- varying float fragmentTextureIndex;
- varying vec4 fragmentColor;
-
- void main() {
- vec2 screenPosition = (vertexTransform * vec3(vertexPosition, 1.0)).xy;
- gl_Position = vec4(screenPosition / screenSize * 2.0 - 1.0, 0.0, 1.0);
- if (vertexTextureIndex > 2.9) {
- fragmentTextureCoordinate = vertexTextureCoordinate / textureSize3;
- } else if (vertexTextureIndex > 1.9) {
- fragmentTextureCoordinate = vertexTextureCoordinate / textureSize2;
- } else if (vertexTextureIndex > 0.9) {
- fragmentTextureCoordinate = vertexTextureCoordinate / textureSize1;
- } else {
- fragmentTextureCoordinate = vertexTextureCoordinate / textureSize0;
- }
- fragmentTextureIndex = vertexTextureIndex;
- fragmentColor = vertexColor;
- }
- ",
-
- "fragmentShader" : "
- #version 110
-
- uniform sampler2D texture0;
- uniform sampler2D texture1;
- uniform sampler2D texture2;
- uniform sampler2D texture3;
-
- varying vec2 fragmentTextureCoordinate;
- varying float fragmentTextureIndex;
- varying vec4 fragmentColor;
-
- void main() {
- if (fragmentTextureIndex > 2.9) {
- gl_FragColor = texture2D(texture3, fragmentTextureCoordinate) * fragmentColor;
- } else if (fragmentTextureIndex > 1.9) {
- gl_FragColor = texture2D(texture2, fragmentTextureCoordinate) * fragmentColor;
- } else if (fragmentTextureIndex > 0.9) {
- gl_FragColor = texture2D(texture1, fragmentTextureCoordinate) * fragmentColor;
- } else {
- gl_FragColor = texture2D(texture0, fragmentTextureCoordinate) * fragmentColor;
- }
- }
- "
- }
- )JSON";
+char const* DefaultVertexShader = R"SHADER(
+#version 110
+
+uniform vec2 textureSize0;
+uniform vec2 textureSize1;
+uniform vec2 textureSize2;
+uniform vec2 textureSize3;
+uniform vec2 screenSize;
+uniform mat3 vertexTransform;
+
+attribute vec2 vertexPosition;
+attribute vec2 vertexTextureCoordinate;
+attribute float vertexTextureIndex;
+attribute vec4 vertexColor;
+attribute float vertexParam1;
+
+varying vec2 fragmentTextureCoordinate;
+varying float fragmentTextureIndex;
+varying vec4 fragmentColor;
+
+void main() {
+ vec2 screenPosition = (vertexTransform * vec3(vertexPosition, 1.0)).xy;
+ gl_Position = vec4(screenPosition / screenSize * 2.0 - 1.0, 0.0, 1.0);
+ if (vertexTextureIndex > 2.9) {
+ fragmentTextureCoordinate = vertexTextureCoordinate / textureSize3;
+ } else if (vertexTextureIndex > 1.9) {
+ fragmentTextureCoordinate = vertexTextureCoordinate / textureSize2;
+ } else if (vertexTextureIndex > 0.9) {
+ fragmentTextureCoordinate = vertexTextureCoordinate / textureSize1;
+ } else {
+ fragmentTextureCoordinate = vertexTextureCoordinate / textureSize0;
+ }
+ fragmentTextureIndex = vertexTextureIndex;
+ fragmentColor = vertexColor;
+}
+)SHADER";
+
+char const* DefaultFragmentShader = R"SHADER(
+#version 110
+
+uniform sampler2D texture0;
+uniform sampler2D texture1;
+uniform sampler2D texture2;
+uniform sampler2D texture3;
+
+varying vec2 fragmentTextureCoordinate;
+varying float fragmentTextureIndex;
+varying vec4 fragmentColor;
+
+void main() {
+ if (fragmentTextureIndex > 2.9) {
+ gl_FragColor = texture2D(texture3, fragmentTextureCoordinate) * fragmentColor;
+ } else if (fragmentTextureIndex > 1.9) {
+ gl_FragColor = texture2D(texture2, fragmentTextureCoordinate) * fragmentColor;
+ } else if (fragmentTextureIndex > 0.9) {
+ gl_FragColor = texture2D(texture1, fragmentTextureCoordinate) * fragmentColor;
+ } else {
+ gl_FragColor = texture2D(texture0, fragmentTextureCoordinate) * fragmentColor;
+ }
+}
+)SHADER";
OpenGl20Renderer::OpenGl20Renderer() {
if (glewInit() != GLEW_OK)
@@ -97,7 +93,7 @@ OpenGl20Renderer::OpenGl20Renderer() {
TextureFiltering::Nearest);
m_immediateRenderBuffer = createGlRenderBuffer();
- setEffectConfig(Json::parse(DefaultEffectConfig));
+ setEffectConfig(JsonObject(), {{"vertex", DefaultVertexShader}, {"fragment", DefaultFragmentShader}});
m_limitTextureGroupSize = false;
m_useMultiTexturing = true;
@@ -119,44 +115,44 @@ Vec2U OpenGl20Renderer::screenSize() const {
return m_screenSize;
}
-void OpenGl20Renderer::setEffectConfig(Json const& effectConfig) {
+void OpenGl20Renderer::setEffectConfig(Json const& effectConfig, StringMap<String> const& shaders) {
flushImmediatePrimitives();
-
GLint status = 0;
char logBuffer[1024];
- GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
- String vertexSource = effectConfig.getString("vertexShader");
- char const* vertexSourcePtr = vertexSource.utf8Ptr();
- glShaderSource(vertexShader, 1, &vertexSourcePtr, NULL);
- glCompileShader(vertexShader);
-
- glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status);
- if (!status) {
- glGetShaderInfoLog(vertexShader, sizeof(logBuffer), NULL, logBuffer);
- throw RendererException(strf("Failed to compile vertex shader: %s\n", logBuffer));
- }
+ auto compileShader = [&](GLenum type, String const& name) -> GLuint {
+ GLuint shader = glCreateShader(type);
+ auto* source = shaders.ptr(name);
+ if (!source)
+ return 0;
+ char const* sourcePtr = source->utf8Ptr();
+ glShaderSource(shader, 1, &sourcePtr, NULL);
+ glCompileShader(shader);
+
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
+ if (!status) {
+ glGetShaderInfoLog(shader, sizeof(logBuffer), NULL, logBuffer);
+ throw RendererException(strf("Failed to compile %s shader: %s\n", name, logBuffer));
+ }
- GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
- String fragmentSource = effectConfig.getString("fragmentShader");
- char const* fragmentSourcePtr = fragmentSource.utf8Ptr();
- glShaderSource(fragmentShader, 1, &fragmentSourcePtr, NULL);
- glCompileShader(fragmentShader);
+ return shader;
+ };
- glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status);
- if (!status) {
- glGetShaderInfoLog(fragmentShader, sizeof(logBuffer), NULL, logBuffer);
- throw RendererException(strf("Failed to compile fragment shader: %s\n", logBuffer));
- }
+ GLuint vertexShader = compileShader(GL_VERTEX_SHADER, "vertex");
+ GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, "fragment");
GLuint program = glCreateProgram();
- glAttachShader(program, vertexShader);
- glAttachShader(program, fragmentShader);
+ if (vertexShader)
+ glAttachShader(program, vertexShader);
+ if (fragmentShader)
+ glAttachShader(program, fragmentShader);
glLinkProgram(program);
- glDeleteShader(vertexShader);
- glDeleteShader(fragmentShader);
+ if (vertexShader)
+ glDeleteShader(vertexShader);
+ if (fragmentShader)
+ glDeleteShader(fragmentShader);
glGetProgramiv(program, GL_LINK_STATUS, &status);
if (!status) {