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

summaryrefslogtreecommitdiff
path: root/source/application
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2024-03-20 01:53:34 +1100
committerKae <80987908+Novaenia@users.noreply.github.com>2024-03-20 01:53:34 +1100
commit6d76a11e256cd96c9cdd7ae5a10c0276e6347277 (patch)
treed52459889408115d1e0eb657a05dc58e098e50eb /source/application
parent58a346e563df12af9194c198c7ffe974411abb28 (diff)
experiment: unclamped lighting
Diffstat (limited to 'source/application')
-rw-r--r--source/application/StarRenderer.hpp3
-rw-r--r--source/application/StarRenderer_opengl20.cpp57
-rw-r--r--source/application/StarRenderer_opengl20.hpp5
3 files changed, 44 insertions, 21 deletions
diff --git a/source/application/StarRenderer.hpp b/source/application/StarRenderer.hpp
index 7b75077..77b53bd 100644
--- a/source/application/StarRenderer.hpp
+++ b/source/application/StarRenderer.hpp
@@ -141,8 +141,7 @@ public:
// The effect config will specify named parameters and textures which can be
// set here.
virtual void setEffectParameter(String const& parameterName, RenderEffectParameter const& parameter) = 0;
- virtual void setEffectTexture(String const& textureName, Image const& image) = 0;
-
+ virtual void setEffectTexture(String const& textureName, ImageView const& image) = 0;
virtual bool switchEffectConfig(String const& name) = 0;
// Any further rendering will be scissored based on this rect, specified in
diff --git a/source/application/StarRenderer_opengl20.cpp b/source/application/StarRenderer_opengl20.cpp
index ac141a4..ca29a70 100644
--- a/source/application/StarRenderer_opengl20.cpp
+++ b/source/application/StarRenderer_opengl20.cpp
@@ -118,7 +118,7 @@ Vec2U OpenGl20Renderer::screenSize() const {
}
OpenGl20Renderer::GlFrameBuffer::GlFrameBuffer(Json const& fbConfig) : config(fbConfig) {
- texture = createGlTexture(Image(), TextureAddressing::Clamp, TextureFiltering::Nearest);
+ texture = createGlTexture(ImageView(), TextureAddressing::Clamp, TextureFiltering::Nearest);
glBindTexture(GL_TEXTURE_2D, texture->glTextureId());
Vec2U size = jsonToVec2U(config.getArray("size", { 256, 256 }));
@@ -147,13 +147,15 @@ void OpenGl20Renderer::loadConfig(Json const& config) {
for (auto& pair : config.getObject("frameBuffers", {}))
m_frameBuffers[pair.first] = make_ref<GlFrameBuffer>(pair.second);
+
+ setScreenSize(m_screenSize);
}
void OpenGl20Renderer::loadEffectConfig(String const& name, Json const& effectConfig, StringMap<String> const& shaders) {
- if (m_effects.contains(name)) {
- Logger::warn("OpenGL effect {} already exists", name);
- switchEffectConfig(name);
- return;
+ if (auto effect = m_effects.ptr(name)) {
+ Logger::info("Reloading OpenGL effect {}", name);
+ glDeleteProgram(effect->program);
+ m_effects.erase(name);
}
GLint status = 0;
@@ -177,8 +179,18 @@ void OpenGl20Renderer::loadEffectConfig(String const& name, Json const& effectCo
return shader;
};
- GLuint vertexShader = compileShader(GL_VERTEX_SHADER, "vertex");
- GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, "fragment");
+ GLuint vertexShader = 0, fragmentShader = 0;
+ try {
+ vertexShader = compileShader(GL_VERTEX_SHADER, "vertex");
+ fragmentShader = compileShader(GL_FRAGMENT_SHADER, "fragment");
+ }
+ catch (RendererException const& e) {
+ Logger::error("Shader compile error, using default: {}", e.what());
+ if (vertexShader) glDeleteShader(vertexShader);
+ if (fragmentShader) glDeleteShader(fragmentShader);
+ vertexShader = compileShader(GL_VERTEX_SHADER, DefaultVertexShader);
+ fragmentShader = compileShader(GL_FRAGMENT_SHADER, DefaultFragmentShader);
+ }
GLuint program = glCreateProgram();
@@ -308,7 +320,7 @@ void OpenGl20Renderer::setEffectParameter(String const& parameterName, RenderEff
ptr->parameterValue = value;
}
-void OpenGl20Renderer::setEffectTexture(String const& textureName, Image const& image) {
+void OpenGl20Renderer::setEffectTexture(String const& textureName, ImageView const& image) {
auto ptr = m_currentEffect->textures.ptr(textureName);
if (!ptr)
return;
@@ -319,8 +331,8 @@ void OpenGl20Renderer::setEffectTexture(String const& textureName, Image const&
ptr->textureValue = createGlTexture(image, ptr->textureAddressing, ptr->textureFiltering);
} else {
glBindTexture(GL_TEXTURE_2D, ptr->textureValue->textureId);
- ptr->textureValue->textureSize = image.size();
- uploadTextureImage(image.pixelFormat(), image.size(), image.data());
+ ptr->textureValue->textureSize = image.size;
+ uploadTextureImage(image.format, image.size, image.data);
}
if (ptr->textureSizeUniform != -1) {
@@ -789,7 +801,9 @@ bool OpenGl20Renderer::logGlErrorSummary(String prefix) {
void OpenGl20Renderer::uploadTextureImage(PixelFormat pixelFormat, Vec2U size, uint8_t const* data) {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ Maybe<GLenum> internalFormat;
GLenum format;
+ GLenum type = GL_UNSIGNED_BYTE;
if (pixelFormat == PixelFormat::RGB24)
format = GL_RGB;
else if (pixelFormat == PixelFormat::RGBA32)
@@ -798,10 +812,19 @@ void OpenGl20Renderer::uploadTextureImage(PixelFormat pixelFormat, Vec2U size, u
format = GL_BGR;
else if (pixelFormat == PixelFormat::BGRA32)
format = GL_BGRA;
- else
- throw RendererException("Unsupported texture format in OpenGL20Renderer::uploadTextureImage");
+ else {
+ type = GL_FLOAT;
+ if (pixelFormat == PixelFormat::RGB_F) {
+ internalFormat = GL_RGB32F;
+ format = GL_RGB;
+ } else if (pixelFormat == PixelFormat::RGBA_F) {
+ internalFormat = GL_RGBA32F;
+ format = GL_RGBA;
+ } else
+ throw RendererException("Unsupported texture format in OpenGL20Renderer::uploadTextureImage");
+ }
- glTexImage2D(GL_TEXTURE_2D, 0, format, size[0], size[1], 0, format, GL_UNSIGNED_BYTE, data);
+ glTexImage2D(GL_TEXTURE_2D, 0, internalFormat.value(format), size[0], size[1], 0, format, type, data);
}
void OpenGl20Renderer::flushImmediatePrimitives() {
@@ -813,12 +836,12 @@ void OpenGl20Renderer::flushImmediatePrimitives() {
renderGlBuffer(*m_immediateRenderBuffer, Mat3F::identity());
}
-auto OpenGl20Renderer::createGlTexture(Image const& image, TextureAddressing addressing, TextureFiltering filtering)
- -> RefPtr<GlLoneTexture> {
+auto OpenGl20Renderer::createGlTexture(ImageView const& image, TextureAddressing addressing, TextureFiltering filtering)
+ ->RefPtr<GlLoneTexture> {
auto glLoneTexture = make_ref<GlLoneTexture>();
glLoneTexture->textureFiltering = filtering;
glLoneTexture->textureAddressing = addressing;
- glLoneTexture->textureSize = image.size();
+ glLoneTexture->textureSize = image.size;
glGenTextures(1, &glLoneTexture->textureId);
if (glLoneTexture->textureId == 0)
@@ -844,7 +867,7 @@ auto OpenGl20Renderer::createGlTexture(Image const& image, TextureAddressing add
if (!image.empty())
- uploadTextureImage(image.pixelFormat(), image.size(), image.data());
+ uploadTextureImage(image.format, image.size, image.data);
return glLoneTexture;
}
diff --git a/source/application/StarRenderer_opengl20.hpp b/source/application/StarRenderer_opengl20.hpp
index 8c96775..fa406b6 100644
--- a/source/application/StarRenderer_opengl20.hpp
+++ b/source/application/StarRenderer_opengl20.hpp
@@ -25,7 +25,7 @@ public:
void loadEffectConfig(String const& name, Json const& effectConfig, StringMap<String> const& shaders) override;
void setEffectParameter(String const& parameterName, RenderEffectParameter const& parameter) override;
- void setEffectTexture(String const& textureName, Image const& image) override;
+ void setEffectTexture(String const& textureName, ImageView const& image) override;
void setScissorRect(Maybe<RectI> const& scissorRect) override;
@@ -188,7 +188,8 @@ private:
static bool logGlErrorSummary(String prefix);
static void uploadTextureImage(PixelFormat pixelFormat, Vec2U size, uint8_t const* data);
- static RefPtr<GlLoneTexture> createGlTexture(Image const& texture, TextureAddressing addressing, TextureFiltering filtering);
+
+ static RefPtr<GlLoneTexture> createGlTexture(ImageView const& image, TextureAddressing addressing, TextureFiltering filtering);
shared_ptr<GlRenderBuffer> createGlRenderBuffer();