瀏覽代碼

LibGL+LibSoftGPU: Add `GL_ADD` Texture Environment

Jesse Buhagiar 3 年之前
父節點
當前提交
c9f44c746a

+ 2 - 0
Userland/Libraries/LibGL/GL/gl.h

@@ -475,6 +475,8 @@ extern "C" {
 #define GL_MODELVIEW_MATRIX 0x0BA6
 #define GL_PROJECTION_MATRIX 0x0BA7
 
+#define GL_ADD 0x0104
+
 GLAPI void glBegin(GLenum mode);
 GLAPI void glClear(GLbitfield mask);
 GLAPI void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);

+ 4 - 0
Userland/Libraries/LibGL/GLContext.cpp

@@ -2057,6 +2057,7 @@ void GLContext::gl_tex_env(GLenum target, GLenum pname, GLfloat param)
     case GL_MODULATE:
     case GL_REPLACE:
     case GL_DECAL:
+    case GL_ADD:
         m_active_texture_unit->set_env_mode(param_enum);
         m_sampler_config_is_dirty = true;
         break;
@@ -3013,6 +3014,9 @@ void GLContext::sync_device_sampler_config()
         case GL_DECAL:
             config.fixed_function_texture_env_mode = GPU::TextureEnvMode::Decal;
             break;
+        case GL_ADD:
+            config.fixed_function_texture_env_mode = GPU::TextureEnvMode::Add;
+            break;
         default:
             VERIFY_NOT_REACHED();
         }

+ 1 - 0
Userland/Libraries/LibGPU/SamplerConfig.h

@@ -34,6 +34,7 @@ enum class TextureEnvMode {
     Modulate,
     Replace,
     Decal,
+    Add,
 };
 
 struct SamplerConfig final {

+ 6 - 0
Userland/Libraries/LibSoftGPU/Device.cpp

@@ -991,6 +991,12 @@ ALWAYS_INLINE void Device::shade_fragments(PixelQuad& quad)
             quad.out_color.set_z(mix(quad.out_color.z(), texel.z(), dst_alpha));
             break;
         }
+        case GPU::TextureEnvMode::Add:
+            quad.out_color.set_x(quad.out_color.x() + texel.x());
+            quad.out_color.set_y(quad.out_color.y() + texel.y());
+            quad.out_color.set_z(quad.out_color.z() + texel.z());
+            quad.out_color.set_w(quad.out_color.w() * texel.w()); // FIXME: If texture format is `GL_INTENSITY` alpha components must be added (https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexEnv.xml)
+            break;
         default:
             VERIFY_NOT_REACHED();
         }