mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-11 21:37:58 +03:00
LibSoftGPU: Divide texture coordinates by Q
Up until now, we have only dealt with games that pass Q = 1 for their texture coordinates. PrBoom+, however, relies on proper homogenous texture coordinates for its relatively complex sky rendering, which means that we should perform this per-fragment division.
This commit is contained in:
parent
72782d845d
commit
087f565700
Notes:
sideshowbarker
2024-07-17 07:15:20 +09:00
Author: https://github.com/gmta Commit: https://github.com/SerenityOS/serenity/commit/087f565700 Pull-request: https://github.com/SerenityOS/serenity/pull/15150 Reviewed-by: https://github.com/linusg ✅ Reviewed-by: https://github.com/sunverwerth ✅
@ -633,18 +633,6 @@ void Device::rasterize_point_antialiased(GPU::Vertex& point)
|
||||
|
||||
void Device::rasterize_point(GPU::Vertex& point)
|
||||
{
|
||||
// Divide texture coordinates R, S and T by Q
|
||||
for (size_t i = 0; i < GPU::NUM_TEXTURE_UNITS; ++i) {
|
||||
auto& tex_coord = point.tex_coords[i];
|
||||
auto one_over_w = 1 / tex_coord.w();
|
||||
tex_coord = {
|
||||
tex_coord.x() * one_over_w,
|
||||
tex_coord.y() * one_over_w,
|
||||
tex_coord.z() * one_over_w,
|
||||
tex_coord.w(),
|
||||
};
|
||||
}
|
||||
|
||||
if (m_options.point_smooth)
|
||||
rasterize_point_antialiased(point);
|
||||
else
|
||||
@ -1188,7 +1176,8 @@ ALWAYS_INLINE void Device::shade_fragments(PixelQuad& quad)
|
||||
continue;
|
||||
auto const& sampler = m_samplers[i];
|
||||
|
||||
auto texel = sampler.sample_2d(quad.texture_coordinates[i].xy());
|
||||
// OpenGL 2.0 ¶ 3.5.1 states (in a roundabout way) that texture coordinates must be divided by Q
|
||||
auto texel = sampler.sample_2d(quad.texture_coordinates[i].xy() / quad.texture_coordinates[i].w());
|
||||
texture_stage_texel[i] = texel;
|
||||
INCREASE_STATISTICS_COUNTER(g_num_sampler_calls, 1);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user