LibGL: Implement glShadeModel()

This turns off interpolation of vertex colors when GL_FLAT is selected.
This commit is contained in:
Stephan Unverwerth 2021-05-16 14:05:13 +02:00 committed by Andreas Kling
parent 26953c2be1
commit da57563c1c
Notes: sideshowbarker 2024-07-18 18:02:58 +09:00
7 changed files with 51 additions and 6 deletions

View File

@ -3,6 +3,7 @@ set(SOURCES
GLBlend.cpp
GLColor.cpp
GLContext.cpp
GLLights.cpp
GLLists.cpp
GLMat.cpp
GLUtils.cpp

View File

@ -79,6 +79,10 @@ extern "C" {
#define GL_COMPILE 0x1300
#define GL_COMPILE_AND_EXECUTE 0x1301
// Lighting related defines
#define GL_FLAT 0x1D00
#define GL_SMOOTH 0x1D01
// More blend factors
#define GL_CONSTANT_COLOR 0x8001
#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
@ -147,6 +151,7 @@ GLAPI void glNewList(GLuint list, GLenum mode);
GLAPI void glFlush();
GLAPI void glFinish();
GLAPI void glBlendFunc(GLenum sfactor, GLenum dfactor);
GLAPI void glShadeModel(GLenum mode);
#ifdef __cplusplus
}

View File

@ -50,6 +50,7 @@ public:
virtual void gl_flush() = 0;
virtual void gl_finish() = 0;
virtual void gl_blend_func(GLenum src_factor, GLenum dst_factor) = 0;
virtual void gl_shade_model(GLenum mode) = 0;
virtual void present() = 0;
};

View File

@ -0,0 +1,15 @@
/*
* Copyright (c) 2021, Stephan Unverwerth <s.unverwerth@gmx.de>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "GL/gl.h"
#include "GLContext.h"
extern GL::GLContext* g_gl_context;
void glShadeModel(GLenum mode)
{
g_gl_context->gl_shade_model(mode);
}

View File

@ -925,6 +925,23 @@ void SoftwareGLContext::gl_blend_func(GLenum src_factor, GLenum dst_factor)
m_rasterizer.set_options(options);
}
void SoftwareGLContext::gl_shade_model(GLenum mode)
{
if (m_in_draw_state) {
m_error = GL_INVALID_OPERATION;
return;
}
if (mode != GL_FLAT && mode != GL_SMOOTH) {
m_error = GL_INVALID_ENUM;
return;
}
auto options = m_rasterizer.options();
options.shade_smooth = (mode == GL_SMOOTH);
m_rasterizer.set_options(options);
}
void SoftwareGLContext::present()
{
m_rasterizer.blit_to(*m_frontbuffer);

View File

@ -56,6 +56,7 @@ public:
virtual void gl_flush() override;
virtual void gl_finish() override;
virtual void gl_blend_func(GLenum src_factor, GLenum dst_factor) override;
virtual void gl_shade_model(GLenum mode) override;
virtual void present() override;

View File

@ -295,11 +295,16 @@ static void rasterize_triangle(const RasterizerOptions& options, Gfx::Bitmap& re
barycentric = barycentric * FloatVector3(triangle.vertices[0].w, triangle.vertices[1].w, triangle.vertices[2].w) * interpolated_w;
// FIXME: make this more generic. We want to interpolate more than just color and uv
auto rgba = interpolate(
FloatVector4(triangle.vertices[0].r, triangle.vertices[0].g, triangle.vertices[0].b, triangle.vertices[0].a),
FloatVector4(triangle.vertices[1].r, triangle.vertices[1].g, triangle.vertices[1].b, triangle.vertices[1].a),
FloatVector4(triangle.vertices[2].r, triangle.vertices[2].g, triangle.vertices[2].b, triangle.vertices[2].a),
barycentric);
FloatVector4 vertex_color;
if (options.shade_smooth) {
vertex_color = interpolate(
FloatVector4(triangle.vertices[0].r, triangle.vertices[0].g, triangle.vertices[0].b, triangle.vertices[0].a),
FloatVector4(triangle.vertices[1].r, triangle.vertices[1].g, triangle.vertices[1].b, triangle.vertices[1].a),
FloatVector4(triangle.vertices[2].r, triangle.vertices[2].g, triangle.vertices[2].b, triangle.vertices[2].a),
barycentric);
} else {
vertex_color = { triangle.vertices[0].r, triangle.vertices[0].g, triangle.vertices[0].b, triangle.vertices[0].a };
}
auto uv = interpolate(
FloatVector2(triangle.vertices[0].u, triangle.vertices[0].v),
@ -307,7 +312,7 @@ static void rasterize_triangle(const RasterizerOptions& options, Gfx::Bitmap& re
FloatVector2(triangle.vertices[2].u, triangle.vertices[2].v),
barycentric);
*pixel = pixel_shader(uv, rgba);
*pixel = pixel_shader(uv, vertex_color);
}
}