Skip to content

Commit 6036e69

Browse files
committed
wip
1 parent 7237487 commit 6036e69

File tree

5 files changed

+100
-35
lines changed

5 files changed

+100
-35
lines changed

shaders/star_frag.glsl

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,43 @@
1-
uniform sampler2D starTex;
2-
varying vec4 color;
1+
const float degree_per_px = 0.05;
2+
const float br_limit = 1.0 / (255.0 * 12.92);
3+
4+
varying vec3 v_color;
5+
varying vec3 v_tetha_k;
6+
varying float pointSize;
7+
8+
float psf_square(float theta, float min_theta, float max_theta, float k)
9+
{
10+
// Human eye's point source function, optimized to fit a square.
11+
// Lower limit on brightness and angular size: 1 Vega and 0.05 degrees per pixel.
12+
// No upper limits.
13+
14+
if (theta < min_theta)
15+
return 1.0; // overexposed
16+
17+
if (theta < max_theta)
18+
{
19+
float brackets = max_theta / theta - 1.0;
20+
return k * brackets * brackets;
21+
}
22+
23+
return 0.0;
24+
}
325

426
void main(void)
527
{
6-
gl_FragColor = texture2D(starTex, gl_PointCoord) * color;
28+
float max_theta = v_tetha_k.x;
29+
if (max_theta == -1.0)
30+
{
31+
gl_FragColor = vec4(v_color, 1.0);
32+
}
33+
else
34+
{
35+
float min_theta = v_tetha_k.y;
36+
float k = v_tetha_k.z;
37+
// Option 2: glare square render
38+
vec2 offset = (gl_PointCoord.xy - vec2(0.5)) * pointSize;
39+
float theta = length(offset) * degree_per_px;
40+
41+
gl_FragColor = vec4(v_color * psf_square(theta, min_theta, max_theta, k), 1.0);
42+
}
743
}

shaders/star_vert.glsl

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,41 @@
1-
attribute vec3 in_Position;
2-
attribute vec4 in_Color;
3-
attribute float in_PointSize;
4-
varying vec4 color;
1+
2+
const float degree_per_px = 0.05;
3+
const float br_limit = 1.0 / (255.0 * 12.92);
4+
5+
varying vec3 v_color; // 12
6+
varying vec3 v_tetha_k; // 24
7+
varying float pointSize; // 28
8+
9+
uniform vec2 viewportSize;
10+
11+
attribute vec4 in_Position;
12+
attribute vec3 in_Color;
13+
attribute float in_PointSize; // scaled brightness measured in Vegas
14+
515

616
void main(void)
717
{
8-
gl_PointSize = in_PointSize;
9-
color = in_Color;
10-
set_vp(vec4(in_Position, 1.0));
18+
float linearBr = pow(10.0, 0.4f * in_PointSize) * br_limit;
19+
vec3 color0 = in_Color * (linearBr / in_Color.g); // scaling on brightness and normalizing by green channel
20+
21+
vec3 check_vec = step(vec3(1.0), color0); // step(edge, x) - For element i of the return value, 0.0 is returned if x[i] < edge[i], and 1.0 is returned otherwise.
22+
float check = check_vec.x + check_vec.y + check_vec.z;
23+
if (check == 0.0)
24+
{
25+
pointSize = 1.0;
26+
v_tetha_k = vec3(-1.0);
27+
}
28+
else
29+
{
30+
float max_br = sqrt(max(color0.r, max(color0.g, color0.b)));
31+
float max_theta = 0.2 * sqrt(max_br); // glare radius
32+
float k = 3.3e-5 * pow(max_theta, -2.5); // common constant, depending originally on star brightness
33+
float min_theta = max_theta / (pow(k, -0.5) + 1.0);
34+
pointSize = floor(max_theta / (sqrt(0.5 * br_limit / (k * max_br)) + 1.0) / degree_per_px);
35+
v_tetha_k = vec3(max_theta, min_theta, k);
36+
}
37+
38+
gl_PointSize = pointSize;
39+
v_color = color0;
40+
set_vp(in_Position);
1141
}

src/celengine/pointstarrenderer.cpp

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@
1111
#include <celengine/starcolors.h>
1212
#include <celengine/star.h>
1313
#include <celengine/univcoord.h>
14+
#include <cmath>
1415
#include "pointstarvertexbuffer.h"
1516
#include "render.h"
1617
#include "pointstarrenderer.h"
1718

19+
#include <fmt/format.h>
20+
1821
using namespace std;
1922
using namespace Eigen;
2023

@@ -95,19 +98,10 @@ void PointStarRenderer::process(const Star& star, float distance, float appMag)
9598
// planets.
9699
if (distance > SolarSystemMaxDistance)
97100
{
98-
float pointSize, alpha, glareSize, glareAlpha;
99-
float size = BaseStarDiscSize * static_cast<float>(renderer->getScreenDpi()) / 96.0f;
100-
renderer->calculatePointSize(appMag,
101-
size,
102-
pointSize,
103-
alpha,
104-
glareSize,
105-
glareAlpha);
106-
107-
if (glareSize != 0.0f)
108-
glareVertexBuffer->addStar(relPos, Color(starColor, glareAlpha), glareSize);
109-
if (pointSize != 0.0f)
110-
starVertexBuffer->addStar(relPos, Color(starColor, alpha), pointSize);
101+
if (appMag < faintestMag)
102+
{
103+
starVertexBuffer->addStar(relPos, starColor, faintestMag - appMag);
104+
}
111105

112106
// Place labels for stars brighter than the specified label threshold brightness
113107
if (((labelMode & Renderer::StarLabels) != 0) && appMag < labelThresholdMag)

src/celengine/pointstarvertexbuffer.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ void PointStarVertexBuffer::startBasicPoints()
4848

4949
void PointStarVertexBuffer::render()
5050
{
51-
if (m_nStars != 0)
51+
if (m_nStars != 0 && m_prog != nullptr)
5252
{
5353
makeCurrent();
5454

@@ -69,7 +69,7 @@ void PointStarVertexBuffer::render()
6969

7070
void PointStarVertexBuffer::makeCurrent()
7171
{
72-
if (current == this || m_prog == nullptr)
72+
if (current == this)
7373
return;
7474

7575
if (current != nullptr)
@@ -79,6 +79,9 @@ void PointStarVertexBuffer::makeCurrent()
7979

8080
m_prog->use();
8181
m_prog->setMVPMatrices(m_renderer.getCurrentProjectionMatrix(), m_renderer.getCurrentModelViewMatrix());
82+
int x, y, w, h;
83+
m_renderer.getViewport(&x, &y, &w, &h);
84+
m_prog->vec2Param("viewportSize") = Eigen::Vector2f(w-x, h-y);
8285
if (m_pointSizeFromVertex)
8386
{
8487
m_prog->samplerParam("starTex") = 0;

src/celengine/render.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ Renderer::Renderer() :
264264

265265
{
266266
pointStarVertexBuffer = new PointStarVertexBuffer(*this, 2048);
267-
glareVertexBuffer = new PointStarVertexBuffer(*this, 2048);
267+
//glareVertexBuffer = new PointStarVertexBuffer(*this, 2048);
268268

269269
for (int i = 0; i < (int) FontCount; i++)
270270
{
@@ -277,7 +277,7 @@ Renderer::Renderer() :
277277
Renderer::~Renderer()
278278
{
279279
delete pointStarVertexBuffer;
280-
delete glareVertexBuffer;
280+
//delete glareVertexBuffer;
281281
delete shaderManager;
282282

283283
m_atmosphereRenderer->deinitGL();
@@ -1795,8 +1795,10 @@ void Renderer::renderObjectAsPoint(const Vector3f& position,
17951795
gaussianGlareTex->bind();
17961796
if (glareSize > gl::maxPointSize)
17971797
m_largeStarRenderer->render(center, {color, glareAlpha}, glareSize, mvp);
1798+
/*
17981799
else
17991800
glareVertexBuffer->addStar(center, {color, glareAlpha}, glareSize);
1801+
*/
18001802
}
18011803
}
18021804
}
@@ -3817,7 +3819,7 @@ void Renderer::renderPointStars(const StarDatabase& starDB,
38173819
starRenderer.viewNormal = getCameraOrientationf().conjugate() * -Vector3f::UnitZ();
38183820
starRenderer.renderList = &renderList;
38193821
starRenderer.starVertexBuffer = pointStarVertexBuffer;
3820-
starRenderer.glareVertexBuffer = glareVertexBuffer;
3822+
//starRenderer.glareVertexBuffer = glareVertexBuffer;
38213823
starRenderer.fov = fov;
38223824
starRenderer.cosFOV = std::cos(math::degToRad(calcMaxFOV(fov, getAspectRatio())) / 2.0f);
38233825

@@ -3836,11 +3838,11 @@ void Renderer::renderPointStars(const StarDatabase& starDB,
38363838
gaussianDiscTex->bind();
38373839
starRenderer.starVertexBuffer->setTexture(gaussianDiscTex);
38383840
starRenderer.starVertexBuffer->setPointScale(screenDpi / 96.0f);
3839-
starRenderer.glareVertexBuffer->setTexture(gaussianGlareTex);
3840-
starRenderer.glareVertexBuffer->setPointScale(screenDpi / 96.0f);
3841+
//starRenderer.glareVertexBuffer->setTexture(gaussianGlareTex);
3842+
//starRenderer.glareVertexBuffer->setPointScale(screenDpi / 96.0f);
38413843

38423844
PointStarVertexBuffer::enable();
3843-
starRenderer.glareVertexBuffer->startSprites();
3845+
//starRenderer.glareVertexBuffer->startSprites();
38443846
if (starStyle == PointStars)
38453847
starRenderer.starVertexBuffer->startBasicPoints();
38463848
else
@@ -3859,7 +3861,7 @@ void Renderer::renderPointStars(const StarDatabase& starDB,
38593861
faintestMagNight);
38603862

38613863
starRenderer.starVertexBuffer->finish();
3862-
starRenderer.glareVertexBuffer->finish();
3864+
//starRenderer.glareVertexBuffer->finish();
38633865
PointStarVertexBuffer::disable();
38643866

38653867
#ifndef GL_ES
@@ -5332,9 +5334,9 @@ Renderer::renderSolarSystemObjects(const Observer &observer,
53325334
setPipelineState(ps);
53335335

53345336
PointStarVertexBuffer::enable();
5335-
glareVertexBuffer->startSprites();
5336-
glareVertexBuffer->render();
5337-
glareVertexBuffer->finish();
5337+
//glareVertexBuffer->startSprites();
5338+
//glareVertexBuffer->render();
5339+
//glareVertexBuffer->finish();
53385340
if (starStyle == PointStars)
53395341
pointStarVertexBuffer->startBasicPoints();
53405342
else

0 commit comments

Comments
 (0)