Skip to content

Commit 797a182

Browse files
authored
Use a single shader programm for rendering (#18)
1 parent 88f100a commit 797a182

File tree

3 files changed

+35
-40
lines changed

3 files changed

+35
-40
lines changed

python/cli/visualization/visualizer_renderers/mesh.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,21 @@ def __init__(self, program):
2626

2727
class MeshRenderer:
2828
meshProgram = None
29-
mesh = None
30-
updated = False
31-
vbo_position = None
32-
vbo_color = None
33-
ebo = None
3429

3530
def __init__(self, mesh=None, opacity=1.0):
3631
self.mesh = mesh
3732
self.updated = mesh is not None
3833
self.opacity = opacity
34+
self.vbo_position = None
35+
self.vbo_color = None
36+
self.ebo = None
3937

4038
def render(self, modelMatrix, viewMatrix, projectionMatrix):
41-
if self.meshProgram is None:
39+
if MeshRenderer.meshProgram is None:
4240
assetDir = pathlib.Path(__file__).resolve().parent
4341
vert = (assetDir / "mesh.vert").read_text()
4442
frag = (assetDir / "mesh.frag").read_text()
45-
self.meshProgram = MeshProgram(createProgram(vert, frag))
43+
MeshRenderer.meshProgram = MeshProgram(createProgram(vert, frag))
4644

4745
if self.mesh is None: return
4846
modelView = viewMatrix @ modelMatrix
@@ -53,10 +51,10 @@ def render(self, modelMatrix, viewMatrix, projectionMatrix):
5351
if self.opacity >= 1.0: glDepthMask(GL_TRUE)
5452
else: glDepthMask(GL_FALSE)
5553

56-
glUseProgram(self.meshProgram.program)
57-
glUniformMatrix4fv(self.meshProgram.uniformModelView, 1, GL_FALSE, modelView.transpose())
58-
glUniformMatrix4fv(self.meshProgram.uniformProjection, 1, GL_FALSE, projectionMatrix.transpose())
59-
glUniform1f(self.meshProgram.uniformOpacity, self.opacity)
54+
glUseProgram(MeshRenderer.meshProgram.program)
55+
glUniformMatrix4fv(MeshRenderer.meshProgram.uniformModelView, 1, GL_FALSE, modelView.transpose())
56+
glUniformMatrix4fv(MeshRenderer.meshProgram.uniformProjection, 1, GL_FALSE, projectionMatrix.transpose())
57+
glUniform1f(MeshRenderer.meshProgram.uniformOpacity, self.opacity)
6058

6159
if self.updated:
6260
self.updated = False

python/cli/visualization/visualizer_renderers/point_cloud.py

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,13 @@ def __init__(self, program):
4343
self.uniformColorMode = glGetUniformLocation(self.program, "u_ColorMode")
4444
self.uniformHasColor = glGetUniformLocation(self.program, "u_HasColor")
4545
self.uniformHasNormal = glGetUniformLocation(self.program, "u_HasNormal")
46+
self.uniformMaxZ = glGetUniformLocation(self.program, "u_maxZ")
47+
self.uniformColorMapScale = glGetUniformLocation(self.program, "u_colorMapScale")
4648

4749
class PointCloudRenderer:
50+
pcProgram = None
51+
4852
def __init__(self, pointCloud=None, pointSize=1.0, opacity=1.0, maxZ=None, colorMapScale=1.0):
49-
self.pcProgram = None
5053
self.pointCloud = pointCloud
5154
self.vboPosition = None
5255
self.vboColor = None
@@ -60,18 +63,11 @@ def __init__(self, pointCloud=None, pointSize=1.0, opacity=1.0, maxZ=None, color
6063
self.colorMapScale = 0.05 * colorMapScale
6164

6265
def render(self, modelMatrix, viewMatrix, projectionMatrix):
63-
if self.pcProgram is None:
66+
if PointCloudRenderer.pcProgram is None:
6467
assetDir = pathlib.Path(__file__).resolve().parent
6568
pcVert = (assetDir / "point_cloud.vert").read_text()
66-
# Poor man's GLSL templates
67-
replaceMap = {
68-
'{MAX_Z}': str(self.maxZ),
69-
'{COLOR_MAP_SCALE}': str(self.colorMapScale)
70-
}
71-
for k, v in replaceMap.items():
72-
pcVert = pcVert.replace(k, v)
7369
pcFrag = (assetDir / "point_cloud.frag").read_text()
74-
self.pcProgram = PointCloudProgram(createProgram(pcVert, pcFrag))
70+
PointCloudRenderer.pcProgram = PointCloudProgram(createProgram(pcVert, pcFrag))
7571

7672
if self.pointCloud is None: return
7773

@@ -83,17 +79,19 @@ def render(self, modelMatrix, viewMatrix, projectionMatrix):
8379
if self.opacity >= 1.0: glDepthMask(GL_TRUE)
8480
else: glDepthMask(GL_FALSE)
8581

86-
glUseProgram(self.pcProgram.program)
87-
glUniformMatrix4fv(self.pcProgram.uniformModel, 1, GL_FALSE, modelMatrix.transpose())
88-
glUniformMatrix4fv(self.pcProgram.uniformView, 1, GL_FALSE, viewMatrix.transpose())
89-
glUniformMatrix4fv(self.pcProgram.uniformProjection, 1, GL_FALSE, projectionMatrix.transpose())
90-
glUniform3f(self.pcProgram.uniformCameraPositionWorld, self.cameraPositionWorld[0], self.cameraPositionWorld[1], self.cameraPositionWorld[2])
91-
92-
glUniform1f(self.pcProgram.uniformPointSize, self.pointSize)
93-
glUniform1f(self.pcProgram.uniformOpacity, self.opacity)
94-
glUniform1i(self.pcProgram.uniformColorMode, self.colorMode)
95-
glUniform1i(self.pcProgram.uniformHasColor, 0 if self.pointCloud.colors is None else 1)
96-
glUniform1i(self.pcProgram.uniformHasNormal, 0 if self.pointCloud.normals is None else 1)
82+
glUseProgram(PointCloudRenderer.pcProgram.program)
83+
glUniformMatrix4fv(PointCloudRenderer.pcProgram.uniformModel, 1, GL_FALSE, modelMatrix.transpose())
84+
glUniformMatrix4fv(PointCloudRenderer.pcProgram.uniformView, 1, GL_FALSE, viewMatrix.transpose())
85+
glUniformMatrix4fv(PointCloudRenderer.pcProgram.uniformProjection, 1, GL_FALSE, projectionMatrix.transpose())
86+
glUniform3f(PointCloudRenderer.pcProgram.uniformCameraPositionWorld, self.cameraPositionWorld[0], self.cameraPositionWorld[1], self.cameraPositionWorld[2])
87+
88+
glUniform1f(PointCloudRenderer.pcProgram.uniformPointSize, self.pointSize)
89+
glUniform1f(PointCloudRenderer.pcProgram.uniformOpacity, self.opacity)
90+
glUniform1i(PointCloudRenderer.pcProgram.uniformColorMode, self.colorMode)
91+
glUniform1i(PointCloudRenderer.pcProgram.uniformHasColor, 0 if self.pointCloud.colors is None else 1)
92+
glUniform1i(PointCloudRenderer.pcProgram.uniformHasNormal, 0 if self.pointCloud.normals is None else 1)
93+
glUniform1f(PointCloudRenderer.pcProgram.uniformMaxZ, self.maxZ)
94+
glUniform1f(PointCloudRenderer.pcProgram.uniformColorMapScale, self.colorMapScale)
9795

9896
if self.updated:
9997
self.updated = False

python/cli/visualization/visualizer_renderers/point_cloud.vert

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ uniform mat4 u_Projection;
1010
uniform vec3 u_CameraPositionWorld;
1111
uniform float u_PointSize;
1212
uniform float u_Opacity;
13+
uniform float u_maxZ;
14+
uniform float u_colorMapScale;
1315
// 0 = original colors
1416
// 1 = x
1517
// 2 = y
@@ -22,9 +24,6 @@ uniform int u_HasNormal; // 0 == false, otherwise true
2224

2325
out vec4 frag_Color;
2426

25-
const float MAX_Z = float({MAX_Z});
26-
const float COLOR_MAP_SCALE = float({COLOR_MAP_SCALE});
27-
2827
vec3 colorMapJET(float value) {
2928
float r = clamp(1.5 - abs(3.0 - 4.0 * value), 0.0, 1.0);
3029
float g = clamp(1.5 - abs(2.0 - 4.0 * value), 0.0, 1.0);
@@ -45,25 +44,25 @@ void main() {
4544
vec3 color = vec3(0.0, 0.17, 0.21); // default color
4645
float opacity = u_Opacity;
4746

48-
if (MAX_Z != float(0.0) && v_PositionWorld.z > MAX_Z) {
47+
if (u_maxZ != float(0.0) && v_PositionWorld.z > u_maxZ) {
4948
// discard
5049
gl_Position.w = 0;
5150
} else {
5251
switch (u_ColorMode) {
5352
case 1:
54-
color = colorMapJET(0.5 - v_PositionWorld.x * COLOR_MAP_SCALE);
53+
color = colorMapJET(0.5 - v_PositionWorld.x * u_colorMapScale);
5554
break;
5655

5756
case 2:
58-
color = colorMapJET(0.5 - v_PositionWorld.y * COLOR_MAP_SCALE);
57+
color = colorMapJET(0.5 - v_PositionWorld.y * u_colorMapScale);
5958
break;
6059

6160
case 3:
62-
color = colorMapJET(0.5 + v_PositionWorld.z * COLOR_MAP_SCALE * 2.0);
61+
color = colorMapJET(0.5 + v_PositionWorld.z * u_colorMapScale * 2.0);
6362
break;
6463

6564
case 4:
66-
float depth = length(v_PositionWorld.xyz - u_CameraPositionWorld.xyz) * COLOR_MAP_SCALE * 5.0;
65+
float depth = length(v_PositionWorld.xyz - u_CameraPositionWorld.xyz) * u_colorMapScale * 5.0;
6766
color = colorMapJET(exp(-depth*0.5));
6867
break;
6968

0 commit comments

Comments
 (0)