Reimplement unlit sphere with shaders
parent
add171b6fa
commit
54031bba8c
|
@ -4009,135 +4009,49 @@ void Renderer::renderEllipsoidAtmosphere(const Atmosphere& atmosphere,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void setupNightTextureCombine()
|
static void renderSphereUnlit(const RenderInfo& ri,
|
||||||
|
const Frustum& frustum,
|
||||||
|
const Renderer *r)
|
||||||
{
|
{
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
|
Texture* textures[MAX_SPHERE_MESH_TEXTURES];
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_PRIMARY_COLOR_EXT);
|
int nTextures = 0;
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, GL_ONE_MINUS_SRC_COLOR);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_TEXTURE);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, GL_SRC_COLOR);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
ShaderProperties shadprop;
|
||||||
|
|
||||||
#if 0
|
// Set up the textures used by this object
|
||||||
static void setupBumpTexenvAmbient(Color ambientColor)
|
if (ri.baseTex != nullptr)
|
||||||
{
|
|
||||||
float texenvConst[4];
|
|
||||||
texenvConst[0] = ambientColor.red();
|
|
||||||
texenvConst[1] = ambientColor.green();
|
|
||||||
texenvConst[2] = ambientColor.blue();
|
|
||||||
texenvConst[3] = ambientColor.alpha();
|
|
||||||
|
|
||||||
// Set up the texenv_combine extension to do DOT3 bump mapping.
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
|
|
||||||
|
|
||||||
// The primary color contains the light direction in surface
|
|
||||||
// space, and texture0 is a normal map. The lighting is
|
|
||||||
// calculated by computing the dot product.
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_DOT3_RGB);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_PRIMARY_COLOR_EXT);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, GL_SRC_COLOR);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_TEXTURE);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, GL_SRC_COLOR);
|
|
||||||
|
|
||||||
// Add in the ambient color
|
|
||||||
glActiveTexture(GL_TEXTURE1);
|
|
||||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, texenvConst);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_ADD);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_PREVIOUS_EXT);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, GL_SRC_COLOR);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_CONSTANT_EXT);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, GL_SRC_COLOR);
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
// In the final stage, modulate the lighting value by the
|
|
||||||
// base texture color.
|
|
||||||
glActiveTexture(GL_TEXTURE2);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_PREVIOUS_EXT);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, GL_SRC_COLOR);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_TEXTURE);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, GL_SRC_COLOR);
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static void renderSphereDefault(const RenderInfo& ri,
|
|
||||||
const Frustum& frustum,
|
|
||||||
bool lit)
|
|
||||||
{
|
|
||||||
if (lit)
|
|
||||||
glEnable(GL_LIGHTING);
|
|
||||||
else
|
|
||||||
glDisable(GL_LIGHTING);
|
|
||||||
|
|
||||||
if (ri.baseTex == nullptr)
|
|
||||||
{
|
{
|
||||||
glDisable(GL_TEXTURE_2D);
|
shadprop.texUsage = ShaderProperties::DiffuseTexture;
|
||||||
|
textures[nTextures++] = ri.baseTex;
|
||||||
}
|
}
|
||||||
else
|
if (ri.nightTex != nullptr)
|
||||||
{
|
{
|
||||||
glEnable(GL_TEXTURE_2D);
|
shadprop.texUsage |= ShaderProperties::NightTexture;
|
||||||
ri.baseTex->bind();
|
textures[nTextures++] = ri.nightTex;
|
||||||
}
|
}
|
||||||
|
|
||||||
glColor(ri.color);
|
|
||||||
|
|
||||||
g_lodSphere->render(LODSphereMesh::Normals | LODSphereMesh::TexCoords0,
|
|
||||||
frustum, ri.pixWidth,
|
|
||||||
ri.baseTex);
|
|
||||||
if (ri.nightTex != nullptr && ri.useTexEnvCombine)
|
|
||||||
{
|
|
||||||
ri.nightTex->bind();
|
|
||||||
#ifdef USE_HDR
|
|
||||||
#ifdef HDR_COMPRESS
|
|
||||||
Color nightColor(ri.color.red() * 2.f,
|
|
||||||
ri.color.green() * 2.f,
|
|
||||||
ri.color.blue() * 2.f,
|
|
||||||
ri.nightLightScale); // Modulate brightness using alpha
|
|
||||||
#else
|
|
||||||
Color nightColor(ri.color.red(),
|
|
||||||
ri.color.green(),
|
|
||||||
ri.color.blue(),
|
|
||||||
ri.nightLightScale); // Modulate brightness using alpha
|
|
||||||
#endif
|
|
||||||
glColor(nightColor);
|
|
||||||
#endif
|
|
||||||
setupNightTextureCombine();
|
|
||||||
glEnable(GL_BLEND);
|
|
||||||
#ifdef USE_HDR
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
||||||
#else
|
|
||||||
glBlendFunc(GL_ONE, GL_ONE);
|
|
||||||
#endif
|
|
||||||
glAmbientLightColor(Color::Black); // Disable ambient light
|
|
||||||
g_lodSphere->render(LODSphereMesh::Normals | LODSphereMesh::TexCoords0,
|
|
||||||
frustum, ri.pixWidth,
|
|
||||||
ri.nightTex);
|
|
||||||
glAmbientLightColor(ri.ambientColor);
|
|
||||||
#ifdef USE_HDR
|
|
||||||
glColor(ri.color);
|
|
||||||
#endif
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ri.overlayTex != nullptr)
|
if (ri.overlayTex != nullptr)
|
||||||
{
|
{
|
||||||
ri.overlayTex->bind();
|
shadprop.texUsage |= ShaderProperties::OverlayTexture;
|
||||||
glEnable(GL_BLEND);
|
textures[nTextures++] = ri.overlayTex;
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
g_lodSphere->render(LODSphereMesh::Normals | LODSphereMesh::TexCoords0,
|
|
||||||
frustum, ri.pixWidth,
|
|
||||||
ri.overlayTex);
|
|
||||||
glBlendFunc(GL_ONE, GL_ONE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get a shader for the current rendering configuration
|
||||||
|
auto* prog = r->getShaderManager().getShader(shadprop);
|
||||||
|
if (prog == nullptr)
|
||||||
|
return;
|
||||||
|
prog->use();
|
||||||
|
|
||||||
|
prog->textureOffset = 0.0f;
|
||||||
|
// TODO: introduce a new ShaderProperties light model, so those
|
||||||
|
// assignments are not required
|
||||||
|
prog->ambientColor = Color::White.toVector3();
|
||||||
|
prog->opacity = 1.0f;
|
||||||
|
#ifdef USE_HDR
|
||||||
|
prog->nightLightScale = ri.nightLightScale;
|
||||||
|
#endif
|
||||||
|
g_lodSphere->render(frustum, ri.pixWidth, textures, nTextures);
|
||||||
|
|
||||||
|
glUseProgram(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4674,7 +4588,7 @@ void Renderer::renderObject(const Vector3f& pos,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
renderSphereDefault(ri, viewFrustum, false);
|
renderSphereUnlit(ri, viewFrustum, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue