New textureNP implementation

This new implementation uses the previously unused viewport parameter "cota"
This commit is contained in:
gm-matthew 2024-08-01 23:24:46 +01:00
parent 3d8557dc44
commit 493c5aae98
7 changed files with 23 additions and 22 deletions

View file

@ -200,6 +200,7 @@ struct Viewport
float angle_right; float angle_right;
float angle_top; float angle_top;
float angle_bottom; float angle_bottom;
float cota;
Mat4 projectionMatrix; // projection matrix, we will calc this later when we have scene near/far vals Mat4 projectionMatrix; // projection matrix, we will calc this later when we have scene near/far vals

View file

@ -1061,6 +1061,8 @@ void CNew3D::RenderViewport(UINT32 addr)
vp->angle_bottom = -(1.0f - io) / cw; vp->angle_bottom = -(1.0f - io) / cw;
vp->angle_top = -(0.0f - io) / cw; vp->angle_top = -(0.0f - io) / cw;
vp->cota = Util::Uint32AsFloat(vpnode[0x3]);
CalcViewport(vp); CalcViewport(vp);
// Lighting (note that sun vector points toward sun -- away from vertex) // Lighting (note that sun vector points toward sun -- away from vertex)

View file

@ -149,6 +149,8 @@ bool R3DShader::LoadShader(const char* vertexShader, const char* fragmentShader)
m_locHardwareStep = glGetUniformLocation(m_shaderProgram, "hardwareStep"); m_locHardwareStep = glGetUniformLocation(m_shaderProgram, "hardwareStep");
m_locDiscardAlpha = glGetUniformLocation(m_shaderProgram, "discardAlpha"); m_locDiscardAlpha = glGetUniformLocation(m_shaderProgram, "discardAlpha");
m_locCota = glGetUniformLocation(m_shaderProgram, "cota");
return true; return true;
} }
@ -362,6 +364,8 @@ void R3DShader::SetViewportUniforms(const Viewport *vp)
glUniformMatrix4fv(m_locProjMat, 1, GL_FALSE, vp->projectionMatrix); glUniformMatrix4fv(m_locProjMat, 1, GL_FALSE, vp->projectionMatrix);
glUniform1i(m_locHardwareStep, vp->hardwareStep); glUniform1i(m_locHardwareStep, vp->hardwareStep);
glUniform1f(m_locCota, vp->cota);
} }
void R3DShader::SetModelStates(const Model* model) void R3DShader::SetModelStates(const Model* model)

View file

@ -100,6 +100,7 @@ private:
GLint m_locFogAttenuation; GLint m_locFogAttenuation;
GLint m_locFogAmbient; GLint m_locFogAmbient;
GLint m_locProjMat; GLint m_locProjMat;
GLint m_locCota;
// lighting / other // lighting / other
GLint m_locLighting; GLint m_locLighting;

View file

@ -119,15 +119,6 @@ ivec2 GetMicroTexturePos(int id)
return ivec2(xCoords[id],yCoords[id]); return ivec2(xCoords[id],yCoords[id]);
} }
float mip_map_level(in vec3 coordinate)
{
// Real3D uses vertex coordinates rather than texel coordinates to calculate mipmap levels
vec3 dx_vtc = dFdx(coordinate);
vec3 dy_vtc = dFdy(coordinate);
float delta_max_sqr = max(dot(dx_vtc, dx_vtc), dot(dy_vtc, dy_vtc));
return log2(delta_max_sqr / (fsTextureNP * fsTextureNP)) * 0.5; // result not clamped
}
float LinearTexLocations(int wrapMode, float size, float u, out float u0, out float u1) float LinearTexLocations(int wrapMode, float size, float u, out float u0, out float u1)
{ {
float texelSize = 1.0 / size; float texelSize = 1.0 / size;
@ -209,7 +200,7 @@ vec4 texBiLinear(usampler2D texSampler, ivec2 wrapMode, vec2 texSize, ivec2 texP
vec4 GetTextureValue() vec4 GetTextureValue()
{ {
float lod = mip_map_level(fsViewVertex); float lod = -log2(gl_FragCoord.w * gl_FragCoord.w * fsLODBase);
float numLevels = floor(log2(min(float(baseTexInfo.z), float(baseTexInfo.w)))) - 1.0; // r3d only generates down to 2:2 for square textures, otherwise its the min dimension float numLevels = floor(log2(min(float(baseTexInfo.z), float(baseTexInfo.w)))) - 1.0; // r3d only generates down to 2:2 for square textures, otherwise its the min dimension
float fLevel = clamp(lod, 0.0, numLevels); float fLevel = clamp(lod, 0.0, numLevels);
@ -242,7 +233,7 @@ vec4 GetTextureValue()
ivec2 tex2Pos = GetMicroTexturePos(microTextureID); ivec2 tex2Pos = GetMicroTexturePos(microTextureID);
tex2Data = texBiLinear(textureBank[(texturePage+1)&1], ivec2(0), ivec2(128), tex2Pos, fsTexCoord * scale, 0); tex2Data = texBiLinear(textureBank[(texturePage+1)&1], ivec2(0), ivec2(128), tex2Pos, fsTexCoord * scale, 0);
blendFactor = -(lod + microTextureMinLOD) * 0.25; blendFactor = -(lod + microTextureMinLOD) * 0.5;
blendFactor = clamp(blendFactor, 0.0, 0.5); blendFactor = clamp(blendFactor, 0.0, 0.5);
} }

View file

@ -8,6 +8,7 @@ static const char *vertexShaderR3DQuads = R"glsl(
// uniforms // uniforms
uniform float modelScale; uniform float modelScale;
uniform float nodeAlpha; uniform float nodeAlpha;
uniform float cota;
uniform mat4 modelMat; uniform mat4 modelMat;
uniform mat4 projMat; uniform mat4 projMat;
uniform bool translatorMap; uniform bool translatorMap;
@ -30,8 +31,8 @@ out VS_OUT
vec2 texCoord; vec2 texCoord;
vec4 color; vec4 color;
float fixedShade; float fixedShade;
float textureNP;
float discardPoly; // can't have varying bool (glsl spec) float discardPoly; // can't have varying bool (glsl spec)
float LODBase;
} vs_out; } vs_out;
vec4 GetColour(vec4 colour) vec4 GetColour(vec4 colour)
@ -64,7 +65,7 @@ void main(void)
vs_out.color = GetColour(inColour); vs_out.color = GetColour(inColour);
vs_out.texCoord = inTexCoord; vs_out.texCoord = inTexCoord;
vs_out.fixedShade = inFixedShade; vs_out.fixedShade = inFixedShade;
vs_out.textureNP = inTextureNP * modelScale; vs_out.LODBase = -vs_out.discardPoly * cota * inTextureNP;
gl_Position = projMat * modelMat * inVertex; gl_Position = projMat * modelMat * inVertex;
} }
)glsl"; )glsl";
@ -83,8 +84,8 @@ in VS_OUT
vec2 texCoord; vec2 texCoord;
vec4 color; vec4 color;
float fixedShade; float fixedShade;
float textureNP;
float discardPoly; // can't have varying bool (glsl spec) float discardPoly; // can't have varying bool (glsl spec)
float LODBase;
} gs_in[4]; } gs_in[4];
out GS_OUT out GS_OUT
@ -99,7 +100,7 @@ out GS_OUT
flat vec2 texCoord[4]; flat vec2 texCoord[4];
flat vec4 color; flat vec4 color;
flat float fixedShade[4]; flat float fixedShade[4];
flat float textureNP; flat float LODBase;
} gs_out; } gs_out;
//a*b - c*d, computed in a stable fashion (Kahan) //a*b - c*d, computed in a stable fashion (Kahan)
@ -133,7 +134,7 @@ void main(void)
// flat attributes // flat attributes
gs_out.color = gs_in[0].color; gs_out.color = gs_in[0].color;
gs_out.textureNP = gs_in[0].textureNP; gs_out.LODBase = gs_in[0].LODBase;
// precompute crossproducts for all vertex combinations to be looked up in loop below for area computation // precompute crossproducts for all vertex combinations to be looked up in loop below for area computation
precise float cross[4][4]; precise float cross[4][4];
@ -238,7 +239,7 @@ in GS_OUT
flat vec2 texCoord[4]; flat vec2 texCoord[4];
flat vec4 color; flat vec4 color;
flat float fixedShade[4]; flat float fixedShade[4];
flat float textureNP; flat float LODBase;
} fs_in; } fs_in;
//our calculated vertex attributes from the above //our calculated vertex attributes from the above
@ -247,7 +248,7 @@ vec3 fsViewNormal;
vec2 fsTexCoord; vec2 fsTexCoord;
float fsFixedShade; float fsFixedShade;
vec4 fsColor; vec4 fsColor;
float fsTextureNP; float fsLODBase;
//outputs //outputs
layout(location = 0) out vec4 out0; // opaque layout(location = 0) out vec4 out0; // opaque
@ -332,7 +333,7 @@ void QuadraticInterpolation()
fsTexCoord = vec2(0.0); fsTexCoord = vec2(0.0);
fsFixedShade = 0.0; fsFixedShade = 0.0;
fsColor = fs_in.color; fsColor = fs_in.color;
fsTextureNP = fs_in.textureNP; fsLODBase = fs_in.LODBase;
for (int i=0; i<4; i++) { for (int i=0; i<4; i++) {
fsViewVertex += lambda[i] * fs_in.viewVertex[i]; fsViewVertex += lambda[i] * fs_in.viewVertex[i];

View file

@ -8,6 +8,7 @@ static const char *vertexShaderR3D = R"glsl(
// uniforms // uniforms
uniform float modelScale; uniform float modelScale;
uniform float nodeAlpha; uniform float nodeAlpha;
uniform float cota;
uniform mat4 modelMat; uniform mat4 modelMat;
uniform mat4 projMat; uniform mat4 projMat;
uniform bool translatorMap; uniform bool translatorMap;
@ -28,7 +29,7 @@ out vec2 fsTexCoord;
out vec4 fsColor; out vec4 fsColor;
out float fsDiscard; // can't have varying bool (glsl spec) out float fsDiscard; // can't have varying bool (glsl spec)
out float fsFixedShade; out float fsFixedShade;
out float fsTextureNP; out float fsLODBase;
vec4 GetColour(vec4 colour) vec4 GetColour(vec4 colour)
{ {
@ -60,7 +61,7 @@ void main(void)
fsColor = GetColour(inColour); fsColor = GetColour(inColour);
fsTexCoord = inTexCoord; fsTexCoord = inTexCoord;
fsFixedShade = inFixedShade; fsFixedShade = inFixedShade;
fsTextureNP = inTextureNP * modelScale; fsLODBase = -fsDiscard * cota * inTextureNP;
gl_Position = projMat * modelMat * inVertex; gl_Position = projMat * modelMat * inVertex;
} }
)glsl"; )glsl";
@ -119,7 +120,7 @@ in vec4 fsColor;
in vec2 fsTexCoord; in vec2 fsTexCoord;
in float fsDiscard; in float fsDiscard;
in float fsFixedShade; in float fsFixedShade;
in float fsTextureNP; in float fsLODBase;
//outputs //outputs
layout(location = 0) out vec4 out0; // opaque layout(location = 0) out vec4 out0; // opaque