mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
WIP - brightmaps in opengl, artifacts may occur, batching is super broken
This commit is contained in:
parent
3aace4f777
commit
e4a2461faf
3 changed files with 86 additions and 8 deletions
|
|
@ -443,7 +443,7 @@ static UINT8 *MakeBlock(GLMipmap_t *grMipmap)
|
||||||
// Create a composite texture from patches, adapt the texture size to a power of 2
|
// Create a composite texture from patches, adapt the texture size to a power of 2
|
||||||
// height and width for the hardware texture cache.
|
// height and width for the hardware texture cache.
|
||||||
//
|
//
|
||||||
static void HWR_GenerateTexture(INT32 texnum, INT32 basetexnum, GLMapTexture_t *grtex)
|
static void HWR_GenerateTexture(GLMapTexture_t *grtex, INT32 texnum, boolean noencoremap)
|
||||||
{
|
{
|
||||||
UINT8 *block;
|
UINT8 *block;
|
||||||
texture_t *texture;
|
texture_t *texture;
|
||||||
|
|
@ -477,7 +477,7 @@ static void HWR_GenerateTexture(INT32 texnum, INT32 basetexnum, GLMapTexture_t *
|
||||||
grtex->mipmap.height = (UINT16)texture->height;
|
grtex->mipmap.height = (UINT16)texture->height;
|
||||||
grtex->mipmap.format = textureformat;
|
grtex->mipmap.format = textureformat;
|
||||||
|
|
||||||
if (encoremap && R_TextureCanRemap(basetexnum))
|
if (!noencoremap && encoremap)
|
||||||
colormap += COLORMAP_REMAPOFFSET;
|
colormap += COLORMAP_REMAPOFFSET;
|
||||||
|
|
||||||
grtex->mipmap.colormap = Z_Calloc(sizeof(*grtex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL);
|
grtex->mipmap.colormap = Z_Calloc(sizeof(*grtex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL);
|
||||||
|
|
@ -797,7 +797,7 @@ GLMapTexture_t *HWR_GetTexture(INT32 tex, INT32 basetex)
|
||||||
|
|
||||||
// Generate texture if missing from the cache
|
// Generate texture if missing from the cache
|
||||||
if (!grtex->mipmap.data && !grtex->mipmap.downloaded)
|
if (!grtex->mipmap.data && !grtex->mipmap.downloaded)
|
||||||
HWR_GenerateTexture(tex, basetex, grtex);
|
HWR_GenerateTexture(grtex, tex, !R_TextureCanRemap(basetex));
|
||||||
|
|
||||||
// If hardware does not have the texture, then call pfnSetTexture to upload it
|
// If hardware does not have the texture, then call pfnSetTexture to upload it
|
||||||
if (!grtex->mipmap.downloaded)
|
if (!grtex->mipmap.downloaded)
|
||||||
|
|
@ -807,6 +807,29 @@ GLMapTexture_t *HWR_GetTexture(INT32 tex, INT32 basetex)
|
||||||
// The system-memory data can be purged now.
|
// The system-memory data can be purged now.
|
||||||
Z_ChangeTag(grtex->mipmap.data, PU_HWRCACHE_UNLOCKED);
|
Z_ChangeTag(grtex->mipmap.data, PU_HWRCACHE_UNLOCKED);
|
||||||
|
|
||||||
|
if (R_GetTextureBrightmap(tex))
|
||||||
|
{
|
||||||
|
GLMapTexture_t *grtexbright;
|
||||||
|
|
||||||
|
// Every texture in memory, stored in the
|
||||||
|
// hardware renderer's bit depth format. Wow!
|
||||||
|
grtexbright = &gl_textures[R_GetTextureBrightmap(tex)];
|
||||||
|
|
||||||
|
// Generate texture if missing from the cache
|
||||||
|
if (!grtexbright->mipmap.data && !grtexbright->mipmap.downloaded)
|
||||||
|
HWR_GenerateTexture(grtexbright, R_GetTextureBrightmap(tex), true);
|
||||||
|
|
||||||
|
grtexbright->mipmap.flags |= TF_BRIGHTMAP;
|
||||||
|
|
||||||
|
// If hardware does not have the texture, then call pfnSetTexture to upload it
|
||||||
|
if (!grtexbright->mipmap.downloaded)
|
||||||
|
HWD.pfnSetTexture(&grtexbright->mipmap);
|
||||||
|
HWR_SetCurrentTexture(&grtexbright->mipmap);
|
||||||
|
|
||||||
|
// The system-memory data can be purged now.
|
||||||
|
Z_ChangeTag(grtexbright->mipmap.data, PU_HWRCACHE_UNLOCKED);
|
||||||
|
}
|
||||||
|
|
||||||
return grtex;
|
return grtex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -966,6 +989,26 @@ void HWR_GetLevelFlat(levelflat_t *levelflat, boolean noencoremap)
|
||||||
|
|
||||||
// The system-memory data can be purged now.
|
// The system-memory data can be purged now.
|
||||||
Z_ChangeTag(grtex->mipmap.data, PU_HWRCACHE_UNLOCKED);
|
Z_ChangeTag(grtex->mipmap.data, PU_HWRCACHE_UNLOCKED);
|
||||||
|
|
||||||
|
if ((texturenum = R_GetTextureBrightmap(texturenum)))
|
||||||
|
{
|
||||||
|
// Every texture in memory, stored as a 8-bit flat. Wow!
|
||||||
|
grtex = &gl_flats[texturenum];
|
||||||
|
|
||||||
|
// Generate flat if missing from the cache
|
||||||
|
if (!grtex->mipmap.data && !grtex->mipmap.downloaded)
|
||||||
|
HWR_CacheTextureAsFlat(&grtex->mipmap, texturenum, true);
|
||||||
|
|
||||||
|
grtex->mipmap.flags |= TF_BRIGHTMAP;
|
||||||
|
|
||||||
|
// If hardware does not have the texture, then call pfnSetTexture to upload it
|
||||||
|
if (!grtex->mipmap.downloaded)
|
||||||
|
HWD.pfnSetTexture(&grtex->mipmap);
|
||||||
|
HWR_SetCurrentTexture(&grtex->mipmap);
|
||||||
|
|
||||||
|
// The system-memory data can be purged now.
|
||||||
|
Z_ChangeTag(grtex->mipmap.data, PU_HWRCACHE_UNLOCKED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (levelflat->type == LEVELFLAT_PATCH)
|
else if (levelflat->type == LEVELFLAT_PATCH)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -258,6 +258,7 @@ enum ETextureFlags
|
||||||
TF_WRAPXY = TF_WRAPY|TF_WRAPX, // very common so use alias is more easy
|
TF_WRAPXY = TF_WRAPY|TF_WRAPX, // very common so use alias is more easy
|
||||||
TF_CHROMAKEYED = 0x00000010,
|
TF_CHROMAKEYED = 0x00000010,
|
||||||
TF_TRANSPARENT = 0x00000040, // texture with some alpha == 0
|
TF_TRANSPARENT = 0x00000040, // texture with some alpha == 0
|
||||||
|
TF_BRIGHTMAP = 0x00000080,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FTextureInfo
|
struct FTextureInfo
|
||||||
|
|
|
||||||
|
|
@ -580,6 +580,10 @@ static PFNglGetUniformLocation pglGetUniformLocation;
|
||||||
// 13062019
|
// 13062019
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
// textures
|
||||||
|
gluniform_tex,
|
||||||
|
gluniform_brightmap,
|
||||||
|
|
||||||
// lighting
|
// lighting
|
||||||
gluniform_poly_color,
|
gluniform_poly_color,
|
||||||
gluniform_tint_color,
|
gluniform_tint_color,
|
||||||
|
|
@ -703,7 +707,7 @@ static GLRGBAFloat shader_defaultcolor = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
"}\n"
|
"}\n"
|
||||||
|
|
||||||
#define GLSL_SOFTWARE_FADE_EQUATION \
|
#define GLSL_SOFTWARE_FADE_EQUATION \
|
||||||
"float darkness = R_DoomLightingEquation(lighting);\n" \
|
"float darkness = R_DoomLightingEquation(lighting + light_gain);\n" \
|
||||||
"if (fade_start != 0.0 || fade_end != 31.0) {\n" \
|
"if (fade_start != 0.0 || fade_end != 31.0) {\n" \
|
||||||
"float fs = fade_start / 31.0;\n" \
|
"float fs = fade_start / 31.0;\n" \
|
||||||
"float fe = fade_end / 31.0;\n" \
|
"float fe = fade_end / 31.0;\n" \
|
||||||
|
|
@ -746,6 +750,7 @@ static GLRGBAFloat shader_defaultcolor = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
|
||||||
#define GLSL_SOFTWARE_FRAGMENT_SHADER \
|
#define GLSL_SOFTWARE_FRAGMENT_SHADER \
|
||||||
"uniform sampler2D tex;\n" \
|
"uniform sampler2D tex;\n" \
|
||||||
|
"uniform sampler2D brightmap;\n" \
|
||||||
"uniform vec4 poly_color;\n" \
|
"uniform vec4 poly_color;\n" \
|
||||||
"uniform vec4 tint_color;\n" \
|
"uniform vec4 tint_color;\n" \
|
||||||
"uniform vec4 fade_color;\n" \
|
"uniform vec4 fade_color;\n" \
|
||||||
|
|
@ -758,6 +763,7 @@ static GLRGBAFloat shader_defaultcolor = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
"vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n" \
|
"vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n" \
|
||||||
"vec4 base_color = texel * poly_color;\n" \
|
"vec4 base_color = texel * poly_color;\n" \
|
||||||
"vec4 final_color = base_color;\n" \
|
"vec4 final_color = base_color;\n" \
|
||||||
|
"float light_gain = (255.0 - lighting) * floor(texture2D(brightmap, gl_TexCoord[0].st).r);\n" \
|
||||||
GLSL_SOFTWARE_TINT_EQUATION \
|
GLSL_SOFTWARE_TINT_EQUATION \
|
||||||
GLSL_SOFTWARE_FADE_EQUATION \
|
GLSL_SOFTWARE_FADE_EQUATION \
|
||||||
"final_color.a = texel.a * poly_color.a;\n" \
|
"final_color.a = texel.a * poly_color.a;\n" \
|
||||||
|
|
@ -768,6 +774,7 @@ static GLRGBAFloat shader_defaultcolor = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
// accompanying vertex shader (stored in gl_Color)
|
// accompanying vertex shader (stored in gl_Color)
|
||||||
#define GLSL_SOFTWARE_MODEL_LIGHTING_FRAGMENT_SHADER \
|
#define GLSL_SOFTWARE_MODEL_LIGHTING_FRAGMENT_SHADER \
|
||||||
"uniform sampler2D tex;\n" \
|
"uniform sampler2D tex;\n" \
|
||||||
|
"uniform sampler2D brightmap;\n" \
|
||||||
"uniform vec4 poly_color;\n" \
|
"uniform vec4 poly_color;\n" \
|
||||||
"uniform vec4 tint_color;\n" \
|
"uniform vec4 tint_color;\n" \
|
||||||
"uniform vec4 fade_color;\n" \
|
"uniform vec4 fade_color;\n" \
|
||||||
|
|
@ -780,6 +787,7 @@ static GLRGBAFloat shader_defaultcolor = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
"vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n" \
|
"vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n" \
|
||||||
"vec4 base_color = texel * poly_color;\n" \
|
"vec4 base_color = texel * poly_color;\n" \
|
||||||
"vec4 final_color = base_color;\n" \
|
"vec4 final_color = base_color;\n" \
|
||||||
|
"float light_gain = (255.0 - lighting) * floor(texture2D(brightmap, gl_TexCoord[0].st).r);\n" \
|
||||||
GLSL_SOFTWARE_TINT_EQUATION \
|
GLSL_SOFTWARE_TINT_EQUATION \
|
||||||
GLSL_SOFTWARE_FADE_EQUATION \
|
GLSL_SOFTWARE_FADE_EQUATION \
|
||||||
"final_color *= gl_Color;\n" \
|
"final_color *= gl_Color;\n" \
|
||||||
|
|
@ -796,6 +804,7 @@ static GLRGBAFloat shader_defaultcolor = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
|
||||||
#define GLSL_WATER_FRAGMENT_SHADER \
|
#define GLSL_WATER_FRAGMENT_SHADER \
|
||||||
"uniform sampler2D tex;\n" \
|
"uniform sampler2D tex;\n" \
|
||||||
|
"uniform sampler2D brightmap;\n" \
|
||||||
"uniform vec4 poly_color;\n" \
|
"uniform vec4 poly_color;\n" \
|
||||||
"uniform vec4 tint_color;\n" \
|
"uniform vec4 tint_color;\n" \
|
||||||
"uniform vec4 fade_color;\n" \
|
"uniform vec4 fade_color;\n" \
|
||||||
|
|
@ -817,6 +826,7 @@ static GLRGBAFloat shader_defaultcolor = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
"vec4 texel = texture2D(tex, vec2(gl_TexCoord[0].s - sdistort, gl_TexCoord[0].t - cdistort));\n" \
|
"vec4 texel = texture2D(tex, vec2(gl_TexCoord[0].s - sdistort, gl_TexCoord[0].t - cdistort));\n" \
|
||||||
"vec4 base_color = texel * poly_color;\n" \
|
"vec4 base_color = texel * poly_color;\n" \
|
||||||
"vec4 final_color = base_color;\n" \
|
"vec4 final_color = base_color;\n" \
|
||||||
|
"float light_gain = (255.0 - lighting) * floor(texture2D(brightmap, gl_TexCoord[0].st).r);\n" \
|
||||||
GLSL_SOFTWARE_TINT_EQUATION \
|
GLSL_SOFTWARE_TINT_EQUATION \
|
||||||
GLSL_SOFTWARE_FADE_EQUATION \
|
GLSL_SOFTWARE_FADE_EQUATION \
|
||||||
"final_color.a = texel.a * poly_color.a;\n" \
|
"final_color.a = texel.a * poly_color.a;\n" \
|
||||||
|
|
@ -840,6 +850,7 @@ static GLRGBAFloat shader_defaultcolor = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
"void main(void) {\n" \
|
"void main(void) {\n" \
|
||||||
"vec4 base_color = gl_Color;\n" \
|
"vec4 base_color = gl_Color;\n" \
|
||||||
"vec4 final_color = base_color;\n" \
|
"vec4 final_color = base_color;\n" \
|
||||||
|
"float light_gain = 0.0;\n" \
|
||||||
GLSL_SOFTWARE_TINT_EQUATION \
|
GLSL_SOFTWARE_TINT_EQUATION \
|
||||||
GLSL_SOFTWARE_FADE_EQUATION \
|
GLSL_SOFTWARE_FADE_EQUATION \
|
||||||
"gl_FragColor = final_color;\n" \
|
"gl_FragColor = final_color;\n" \
|
||||||
|
|
@ -1154,14 +1165,16 @@ EXPORT void HWRAPI(CleanShaders) (void)
|
||||||
// -----------------+
|
// -----------------+
|
||||||
// SetNoTexture : Disable texture
|
// SetNoTexture : Disable texture
|
||||||
// -----------------+
|
// -----------------+
|
||||||
static void SetNoTexture(void)
|
static void SetNoTexture(GLenum texture)
|
||||||
{
|
{
|
||||||
// Disable texture.
|
// Disable texture.
|
||||||
if (tex_downloaded != NOTEXTURE_NUM)
|
if (tex_downloaded != NOTEXTURE_NUM)
|
||||||
{
|
{
|
||||||
if (NOTEXTURE_NUM == 0)
|
if (NOTEXTURE_NUM == 0)
|
||||||
pglGenTextures(1, &NOTEXTURE_NUM);
|
pglGenTextures(1, &NOTEXTURE_NUM);
|
||||||
|
pglActiveTexture(texture);
|
||||||
pglBindTexture(GL_TEXTURE_2D, NOTEXTURE_NUM);
|
pglBindTexture(GL_TEXTURE_2D, NOTEXTURE_NUM);
|
||||||
|
pglActiveTexture(GL_TEXTURE0);
|
||||||
tex_downloaded = NOTEXTURE_NUM;
|
tex_downloaded = NOTEXTURE_NUM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1307,7 +1320,7 @@ void SetStates(void)
|
||||||
SetBlend(0);
|
SetBlend(0);
|
||||||
|
|
||||||
tex_downloaded = 0;
|
tex_downloaded = 0;
|
||||||
SetNoTexture();
|
SetNoTexture(GL_TEXTURE0);
|
||||||
|
|
||||||
pglPolygonOffset(-1.0f, -1.0f);
|
pglPolygonOffset(-1.0f, -1.0f);
|
||||||
|
|
||||||
|
|
@ -1782,7 +1795,7 @@ EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags)
|
||||||
}
|
}
|
||||||
if (PolyFlags & PF_NoTexture)
|
if (PolyFlags & PF_NoTexture)
|
||||||
{
|
{
|
||||||
SetNoTexture();
|
SetNoTexture(GL_TEXTURE0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CurrentPolyFlags = PolyFlags;
|
CurrentPolyFlags = PolyFlags;
|
||||||
|
|
@ -1906,6 +1919,12 @@ EXPORT void HWRAPI(UpdateTexture) (GLMipmap_t *pTexInfo)
|
||||||
else
|
else
|
||||||
GL_MSG_Warning("UpdateTexture: bad format %d\n", pTexInfo->format);
|
GL_MSG_Warning("UpdateTexture: bad format %d\n", pTexInfo->format);
|
||||||
|
|
||||||
|
if (!(pTexInfo->flags & TF_BRIGHTMAP))
|
||||||
|
{
|
||||||
|
SetNoTexture(GL_TEXTURE1); // will be assigned later, if needed
|
||||||
|
}
|
||||||
|
|
||||||
|
pglActiveTexture(pTexInfo->flags & TF_BRIGHTMAP ? GL_TEXTURE1 : GL_TEXTURE0);
|
||||||
pglBindTexture(GL_TEXTURE_2D, num);
|
pglBindTexture(GL_TEXTURE_2D, num);
|
||||||
tex_downloaded = num;
|
tex_downloaded = num;
|
||||||
|
|
||||||
|
|
@ -1996,6 +2015,8 @@ EXPORT void HWRAPI(UpdateTexture) (GLMipmap_t *pTexInfo)
|
||||||
|
|
||||||
if (maximumAnisotropy)
|
if (maximumAnisotropy)
|
||||||
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisotropic_filter);
|
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisotropic_filter);
|
||||||
|
|
||||||
|
pglActiveTexture(GL_TEXTURE0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------+
|
// -----------------+
|
||||||
|
|
@ -2005,14 +2026,21 @@ EXPORT void HWRAPI(SetTexture) (GLMipmap_t *pTexInfo)
|
||||||
{
|
{
|
||||||
if (!pTexInfo)
|
if (!pTexInfo)
|
||||||
{
|
{
|
||||||
SetNoTexture();
|
SetNoTexture(GL_TEXTURE0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (pTexInfo->downloaded)
|
else if (pTexInfo->downloaded)
|
||||||
{
|
{
|
||||||
if (pTexInfo->downloaded != tex_downloaded)
|
if (pTexInfo->downloaded != tex_downloaded)
|
||||||
{
|
{
|
||||||
|
if (!(pTexInfo->flags & TF_BRIGHTMAP))
|
||||||
|
{
|
||||||
|
SetNoTexture(GL_TEXTURE1); // will be assigned later, if needed
|
||||||
|
}
|
||||||
|
|
||||||
|
pglActiveTexture(pTexInfo->flags & TF_BRIGHTMAP ? GL_TEXTURE1 : GL_TEXTURE0);
|
||||||
pglBindTexture(GL_TEXTURE_2D, pTexInfo->downloaded);
|
pglBindTexture(GL_TEXTURE_2D, pTexInfo->downloaded);
|
||||||
|
pglActiveTexture(GL_TEXTURE0);
|
||||||
tex_downloaded = pTexInfo->downloaded;
|
tex_downloaded = pTexInfo->downloaded;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2084,6 +2112,8 @@ static void Shader_SetUniforms(FSurfaceInfo *Surface, GLRGBAFloat *poly, GLRGBAF
|
||||||
function (uniform, a, b, c, d);
|
function (uniform, a, b, c, d);
|
||||||
|
|
||||||
// polygon
|
// polygon
|
||||||
|
UNIFORM_1(shader->uniforms[gluniform_tex], 0, pglUniform1i);
|
||||||
|
UNIFORM_1(shader->uniforms[gluniform_brightmap], 1, pglUniform1i);
|
||||||
UNIFORM_4(shader->uniforms[gluniform_poly_color], poly->red, poly->green, poly->blue, poly->alpha, pglUniform4f);
|
UNIFORM_4(shader->uniforms[gluniform_poly_color], poly->red, poly->green, poly->blue, poly->alpha, pglUniform4f);
|
||||||
UNIFORM_4(shader->uniforms[gluniform_tint_color], tint->red, tint->green, tint->blue, tint->alpha, pglUniform4f);
|
UNIFORM_4(shader->uniforms[gluniform_tint_color], tint->red, tint->green, tint->blue, tint->alpha, pglUniform4f);
|
||||||
UNIFORM_4(shader->uniforms[gluniform_fade_color], fade->red, fade->green, fade->blue, fade->alpha, pglUniform4f);
|
UNIFORM_4(shader->uniforms[gluniform_fade_color], fade->red, fade->green, fade->blue, fade->alpha, pglUniform4f);
|
||||||
|
|
@ -2183,6 +2213,10 @@ static boolean Shader_CompileProgram(gl_shader_t *shader, GLint i, const GLchar
|
||||||
// 13062019
|
// 13062019
|
||||||
#define GETUNI(uniform) pglGetUniformLocation(shader->program, uniform);
|
#define GETUNI(uniform) pglGetUniformLocation(shader->program, uniform);
|
||||||
|
|
||||||
|
// textures
|
||||||
|
shader->uniforms[gluniform_tex] = GETUNI("tex");
|
||||||
|
shader->uniforms[gluniform_brightmap] = GETUNI("brightmap");
|
||||||
|
|
||||||
// lighting
|
// lighting
|
||||||
shader->uniforms[gluniform_poly_color] = GETUNI("poly_color");
|
shader->uniforms[gluniform_poly_color] = GETUNI("poly_color");
|
||||||
shader->uniforms[gluniform_tint_color] = GETUNI("tint_color");
|
shader->uniforms[gluniform_tint_color] = GETUNI("tint_color");
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue