Skip to content

Commit 2c91e93

Browse files
Performance improvements, change to BVH layout
Some perf improvements, setting up code for move to Embree
1 parent 451ce14 commit 2c91e93

File tree

15 files changed

+123
-195
lines changed

15 files changed

+123
-195
lines changed

src/Main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ void MainLoop(void* arg)
297297
optionsChanged |= ImGui::SliderFloat("Aperture", &aperture, 0.0f, 10.8f);
298298
scene->camera->aperture = aperture / 1000.0f;
299299
optionsChanged |= ImGui::SliderFloat("Focal Distance", &scene->camera->focalDist, 0.01f, 50.0f);
300+
ImGui::Text("Pos: %.2f, %.2f, %.2f", scene->camera->position.x, scene->camera->position.y, scene->camera->position.z);
300301
}
301302

302303
scene->camera->isMoving = false;

src/core/Mesh.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ namespace GLSLPT
3939
public:
4040
Mesh()
4141
{
42-
//bvh = new RadeonRays::SplitBvh(2.0f, 64, 0, 0.001f, 2.5f);
43-
bvh = new RadeonRays::Bvh(2.0f, 64, false);
42+
bvh = new RadeonRays::SplitBvh(2.0f, 64, 0, 0.001f, 0);
43+
//bvh = new RadeonRays::Bvh(2.0f, 64, false);
4444
}
4545
~Mesh() { delete bvh; }
4646

src/core/Renderer.cpp

Lines changed: 28 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@ namespace GLSLPT
4343

4444
Renderer::Renderer(Scene *scene, const std::string& shadersDirectory)
4545
: BVHTex(0)
46-
, BBoxminTex(0)
47-
, BBoxmaxTex(0)
4846
, vertexIndicesTex(0)
4947
, verticesTex(0)
5048
, normalsTex(0)
@@ -78,8 +76,6 @@ namespace GLSLPT
7876
delete quad;
7977

8078
glDeleteTextures(1, &BVHTex);
81-
glDeleteTextures(1, &BBoxminTex);
82-
glDeleteTextures(1, &BBoxmaxTex);
8379
glDeleteTextures(1, &vertexIndicesTex);
8480
glDeleteTextures(1, &verticesTex);
8581
glDeleteTextures(1, &normalsTex);
@@ -108,52 +104,37 @@ namespace GLSLPT
108104

109105
quad = new Quad();
110106

111-
//Create texture for BVH Tree
107+
//Create Buffer and Texture for BVH Tree
108+
glGenBuffers(1, &BVHBuffer);
109+
glBindBuffer(GL_TEXTURE_BUFFER, BVHBuffer);
110+
glBufferData(GL_TEXTURE_BUFFER, sizeof(RadeonRays::BvhTranslator::Node) * scene->bvhTranslator.nodes.size(), &scene->bvhTranslator.nodes[0], GL_STATIC_DRAW);
112111
glGenTextures(1, &BVHTex);
113-
glBindTexture(GL_TEXTURE_2D, BVHTex);
114-
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32I, scene->bvhTranslator.nodeTexWidth, scene->bvhTranslator.nodeTexWidth, 0, GL_RGB_INTEGER, GL_INT, &scene->bvhTranslator.nodes[0]);
115-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
116-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
117-
glBindTexture(GL_TEXTURE_2D, 0);
118-
119-
//Create texture for Bounding boxes
120-
glGenTextures(1, &BBoxminTex);
121-
glBindTexture(GL_TEXTURE_2D, BBoxminTex);
122-
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, scene->bvhTranslator.nodeTexWidth, scene->bvhTranslator.nodeTexWidth, 0, GL_RGB, GL_FLOAT, &scene->bvhTranslator.bboxmin[0]);
123-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
124-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
125-
glBindTexture(GL_TEXTURE_2D, 0);
126-
127-
glGenTextures(1, &BBoxmaxTex);
128-
glBindTexture(GL_TEXTURE_2D, BBoxmaxTex);
129-
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, scene->bvhTranslator.nodeTexWidth, scene->bvhTranslator.nodeTexWidth, 0, GL_RGB, GL_FLOAT, &scene->bvhTranslator.bboxmax[0]);
130-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
131-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
132-
glBindTexture(GL_TEXTURE_2D, 0);
112+
glBindTexture(GL_TEXTURE_BUFFER, BVHTex);
113+
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGB32F, BVHBuffer);
133114

134-
//Create texture for VertexIndices
115+
//Create Buffer and Texture for VertexIndices
116+
glGenBuffers(1, &vertexIndicesBuffer);
117+
glBindBuffer(GL_TEXTURE_BUFFER, vertexIndicesBuffer);
118+
glBufferData(GL_TEXTURE_BUFFER, sizeof(Indices) * scene->vertIndices.size(), &scene->vertIndices[0], GL_STATIC_DRAW);
135119
glGenTextures(1, &vertexIndicesTex);
136-
glBindTexture(GL_TEXTURE_2D, vertexIndicesTex);
137-
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32I, scene->indicesTexWidth, scene->indicesTexWidth, 0, GL_RGB_INTEGER, GL_INT, &scene->vertIndices[0]);
138-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
139-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
140-
glBindTexture(GL_TEXTURE_2D, 0);
120+
glBindTexture(GL_TEXTURE_BUFFER, vertexIndicesTex);
121+
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGB32I, vertexIndicesBuffer);
141122

142-
//Create texture for Vertices
123+
//Create Buffer and Texture for Vertices
124+
glGenBuffers(1, &verticesBuffer);
125+
glBindBuffer(GL_TEXTURE_BUFFER, verticesBuffer);
126+
glBufferData(GL_TEXTURE_BUFFER, sizeof(Vec4) * scene->verticesUVX.size(), &scene->verticesUVX[0], GL_STATIC_DRAW);
143127
glGenTextures(1, &verticesTex);
144-
glBindTexture(GL_TEXTURE_2D, verticesTex);
145-
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, scene->triDataTexWidth, scene->triDataTexWidth, 0, GL_RGBA, GL_FLOAT, &scene->verticesUVX[0]);
146-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
147-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
148-
glBindTexture(GL_TEXTURE_2D, 0);
149-
150-
//Create texture for Normals
128+
glBindTexture(GL_TEXTURE_BUFFER, verticesTex);
129+
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, verticesBuffer);
130+
131+
//Create Buffer and Texture for Normals
132+
glGenBuffers(1, &normalsBuffer);
133+
glBindBuffer(GL_TEXTURE_BUFFER, normalsBuffer);
134+
glBufferData(GL_TEXTURE_BUFFER, sizeof(Vec4) * scene->normalsUVY.size(), &scene->normalsUVY[0], GL_STATIC_DRAW);
151135
glGenTextures(1, &normalsTex);
152-
glBindTexture(GL_TEXTURE_2D, normalsTex);
153-
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, scene->triDataTexWidth, scene->triDataTexWidth, 0, GL_RGBA, GL_FLOAT, &scene->normalsUVY[0]);
154-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
155-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
156-
glBindTexture(GL_TEXTURE_2D, 0);
136+
glBindTexture(GL_TEXTURE_BUFFER, normalsTex);
137+
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, normalsBuffer);
157138

158139
//Create texture for Materials
159140
glGenTextures(1, &materialsTex);
@@ -232,17 +213,10 @@ namespace GLSLPT
232213
glBindTexture(GL_TEXTURE_2D, materialsTex);
233214
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, (sizeof(Material) / sizeof(Vec4)) * scene->materials.size(), 1, 0, GL_RGBA, GL_FLOAT, &scene->materials[0]);
234215

235-
int yPos = scene->bvhTranslator.topLevelIndexPackedXY & 0x00000FFF;
236-
int index = yPos * scene->bvhTranslator.nodeTexWidth;
237-
238-
glBindTexture(GL_TEXTURE_2D, BVHTex);
239-
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, yPos, scene->bvhTranslator.nodeTexWidth, scene->bvhTranslator.nodeTexWidth - yPos, GL_RGB_INTEGER, GL_INT, &scene->bvhTranslator.nodes[index]);
240-
241-
glBindTexture(GL_TEXTURE_2D, BBoxminTex);
242-
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, yPos, scene->bvhTranslator.nodeTexWidth, scene->bvhTranslator.nodeTexWidth - yPos, GL_RGB, GL_FLOAT, &scene->bvhTranslator.bboxmin[index]);
216+
int index = scene->bvhTranslator.topLevelIndex;
243217

244-
glBindTexture(GL_TEXTURE_2D, BBoxmaxTex);
245-
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, yPos, scene->bvhTranslator.nodeTexWidth, scene->bvhTranslator.nodeTexWidth - yPos, GL_RGB, GL_FLOAT, &scene->bvhTranslator.bboxmax[index]);
218+
glBindBuffer(GL_TEXTURE_BUFFER, BVHBuffer);
219+
glBufferSubData(GL_TEXTURE_BUFFER, sizeof(RadeonRays::BvhTranslator::Node) * index, sizeof(RadeonRays::BvhTranslator::Node) * (scene->bvhTranslator.nodes.size() - index), &scene->bvhTranslator.nodes[index]);
246220
}
247221
}
248222
}

src/core/Renderer.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,13 @@ namespace GLSLPT
6969
iVec2 screenSize;
7070
std::string shadersDirectory;
7171

72+
GLuint BVHBuffer;
7273
GLuint BVHTex;
73-
GLuint BBoxminTex;
74-
GLuint BBoxmaxTex;
74+
GLuint vertexIndicesBuffer;
7575
GLuint vertexIndicesTex;
76+
GLuint verticesBuffer;
7677
GLuint verticesTex;
78+
GLuint normalsBuffer;
7779
GLuint normalsTex;
7880
GLuint materialsTex;
7981
GLuint transformsTex;

src/core/Scene.cpp

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -222,21 +222,6 @@ namespace GLSLPT
222222
verticesCnt += meshes[i]->verticesUVX.size();
223223
}
224224

225-
// Resize to power of 2
226-
indicesTexWidth = (int)(sqrt(vertIndices.size()) + 1);
227-
triDataTexWidth = (int)(sqrt(verticesUVX.size())+ 1);
228-
229-
vertIndices.resize(indicesTexWidth * indicesTexWidth);
230-
verticesUVX.resize(triDataTexWidth * triDataTexWidth);
231-
normalsUVY.resize(triDataTexWidth * triDataTexWidth);
232-
233-
for (int i = 0; i < vertIndices.size(); i++)
234-
{
235-
vertIndices[i].x = ((vertIndices[i].x % triDataTexWidth) << 12) | (vertIndices[i].x / triDataTexWidth);
236-
vertIndices[i].y = ((vertIndices[i].y % triDataTexWidth) << 12) | (vertIndices[i].y / triDataTexWidth);
237-
vertIndices[i].z = ((vertIndices[i].z % triDataTexWidth) << 12) | (vertIndices[i].z / triDataTexWidth);
238-
}
239-
240225
//Copy transforms
241226
transforms.resize(meshInstances.size());
242227
#pragma omp parallel for

src/core/Scene.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,10 @@ namespace GLSLPT
9494
std::vector<Mesh*> meshes;
9595

9696
// Scene Mesh Data
97-
std::vector<Indices> vertIndices;
97+
std::vector<Indices> vertIndices;
9898
std::vector<Vec4> verticesUVX; // Vertex Data + x coord of uv
9999
std::vector<Vec4> normalsUVY; // Normal Data + y coord of uv
100100
std::vector<Mat4> transforms;
101-
int indicesTexWidth;
102-
int triDataTexWidth;
103101

104102
//Instances
105103
std::vector<Material> materials;

src/core/TiledRenderer.cpp

Lines changed: 32 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -169,79 +169,69 @@ namespace GLSLPT
169169
shaderObject = pathTraceShader->getObject();
170170

171171
glUniform1f(glGetUniformLocation(shaderObject, "hdrResolution"), scene->hdrData == nullptr ? 0 : float(scene->hdrData->width * scene->hdrData->height));
172-
glUniform1i(glGetUniformLocation(shaderObject, "topBVHIndex"), scene->bvhTranslator.topLevelIndexPackedXY);
173-
glUniform1i(glGetUniformLocation(shaderObject, "vertIndicesSize"), scene->indicesTexWidth);
172+
glUniform1i(glGetUniformLocation(shaderObject, "topBVHIndex"), scene->bvhTranslator.topLevelIndex);
174173
glUniform2f(glGetUniformLocation(shaderObject, "screenResolution"), float(screenSize.x), float(screenSize.y));
175174
glUniform1i(glGetUniformLocation(shaderObject, "numOfLights"), numOfLights);
176175
glUniform1f(glGetUniformLocation(shaderObject, "invNumTilesX"), 1.0f / ((float)screenSize.x / tileWidth));
177176
glUniform1f(glGetUniformLocation(shaderObject, "invNumTilesY"), 1.0f / ((float)screenSize.y / tileHeight));
178177
glUniform1i(glGetUniformLocation(shaderObject, "accumTexture"), 0);
179178
glUniform1i(glGetUniformLocation(shaderObject, "BVH"), 1);
180-
glUniform1i(glGetUniformLocation(shaderObject, "BBoxMin"), 2);
181-
glUniform1i(glGetUniformLocation(shaderObject, "BBoxMax"), 3);
182-
glUniform1i(glGetUniformLocation(shaderObject, "vertexIndicesTex"), 4);
183-
glUniform1i(glGetUniformLocation(shaderObject, "verticesTex"), 5);
184-
glUniform1i(glGetUniformLocation(shaderObject, "normalsTex"), 6);
185-
glUniform1i(glGetUniformLocation(shaderObject, "materialsTex"), 7);
186-
glUniform1i(glGetUniformLocation(shaderObject, "transformsTex"), 8);
187-
glUniform1i(glGetUniformLocation(shaderObject, "lightsTex"), 9);
188-
glUniform1i(glGetUniformLocation(shaderObject, "textureMapsArrayTex"), 10);
189-
glUniform1i(glGetUniformLocation(shaderObject, "hdrTex"), 11);
190-
glUniform1i(glGetUniformLocation(shaderObject, "hdrMarginalDistTex"), 12);
191-
glUniform1i(glGetUniformLocation(shaderObject, "hdrCondDistTex"), 13);
179+
glUniform1i(glGetUniformLocation(shaderObject, "vertexIndicesTex"), 2);
180+
glUniform1i(glGetUniformLocation(shaderObject, "verticesTex"), 3);
181+
glUniform1i(glGetUniformLocation(shaderObject, "normalsTex"), 4);
182+
glUniform1i(glGetUniformLocation(shaderObject, "materialsTex"), 5);
183+
glUniform1i(glGetUniformLocation(shaderObject, "transformsTex"), 6);
184+
glUniform1i(glGetUniformLocation(shaderObject, "lightsTex"), 7);
185+
glUniform1i(glGetUniformLocation(shaderObject, "textureMapsArrayTex"), 8);
186+
glUniform1i(glGetUniformLocation(shaderObject, "hdrTex"), 9);
187+
glUniform1i(glGetUniformLocation(shaderObject, "hdrMarginalDistTex"), 10);
188+
glUniform1i(glGetUniformLocation(shaderObject, "hdrCondDistTex"), 11);
192189

193190
pathTraceShader->StopUsing();
194191

195192
pathTraceShaderLowRes->Use();
196193
shaderObject = pathTraceShaderLowRes->getObject();
197194

198195
glUniform1f(glGetUniformLocation(shaderObject, "hdrResolution"), scene->hdrData == nullptr ? 0 : float(scene->hdrData->width * scene->hdrData->height));
199-
glUniform1i(glGetUniformLocation(shaderObject, "topBVHIndex"), scene->bvhTranslator.topLevelIndexPackedXY);
200-
glUniform1i(glGetUniformLocation(shaderObject, "vertIndicesSize"), scene->indicesTexWidth);
196+
glUniform1i(glGetUniformLocation(shaderObject, "topBVHIndex"), scene->bvhTranslator.topLevelIndex);
201197
glUniform2f(glGetUniformLocation(shaderObject, "screenResolution"), float(screenSize.x), float(screenSize.y));
202198
glUniform1i(glGetUniformLocation(shaderObject, "numOfLights"), numOfLights);
203199
glUniform1i(glGetUniformLocation(shaderObject, "accumTexture"), 0);
204200
glUniform1i(glGetUniformLocation(shaderObject, "BVH"), 1);
205-
glUniform1i(glGetUniformLocation(shaderObject, "BBoxMin"), 2);
206-
glUniform1i(glGetUniformLocation(shaderObject, "BBoxMax"), 3);
207-
glUniform1i(glGetUniformLocation(shaderObject, "vertexIndicesTex"), 4);
208-
glUniform1i(glGetUniformLocation(shaderObject, "verticesTex"), 5);
209-
glUniform1i(glGetUniformLocation(shaderObject, "normalsTex"), 6);
210-
glUniform1i(glGetUniformLocation(shaderObject, "materialsTex"), 7);
211-
glUniform1i(glGetUniformLocation(shaderObject, "transformsTex"), 8);
212-
glUniform1i(glGetUniformLocation(shaderObject, "lightsTex"), 9);
213-
glUniform1i(glGetUniformLocation(shaderObject, "textureMapsArrayTex"), 10);
214-
glUniform1i(glGetUniformLocation(shaderObject, "hdrTex"), 11);
215-
glUniform1i(glGetUniformLocation(shaderObject, "hdrMarginalDistTex"), 12);
216-
glUniform1i(glGetUniformLocation(shaderObject, "hdrCondDistTex"), 13);
201+
glUniform1i(glGetUniformLocation(shaderObject, "vertexIndicesTex"), 2);
202+
glUniform1i(glGetUniformLocation(shaderObject, "verticesTex"), 3);
203+
glUniform1i(glGetUniformLocation(shaderObject, "normalsTex"), 4);
204+
glUniform1i(glGetUniformLocation(shaderObject, "materialsTex"), 5);
205+
glUniform1i(glGetUniformLocation(shaderObject, "transformsTex"), 6);
206+
glUniform1i(glGetUniformLocation(shaderObject, "lightsTex"), 7);
207+
glUniform1i(glGetUniformLocation(shaderObject, "textureMapsArrayTex"), 8);
208+
glUniform1i(glGetUniformLocation(shaderObject, "hdrTex"), 9);
209+
glUniform1i(glGetUniformLocation(shaderObject, "hdrMarginalDistTex"), 10);
210+
glUniform1i(glGetUniformLocation(shaderObject, "hdrCondDistTex"), 11);
217211

218212
pathTraceShaderLowRes->StopUsing();
219213

220214
glActiveTexture(GL_TEXTURE1);
221-
glBindTexture(GL_TEXTURE_2D, BVHTex);
215+
glBindTexture(GL_TEXTURE_BUFFER, BVHTex);
222216
glActiveTexture(GL_TEXTURE2);
223-
glBindTexture(GL_TEXTURE_2D, BBoxminTex);
217+
glBindTexture(GL_TEXTURE_BUFFER, vertexIndicesTex);
224218
glActiveTexture(GL_TEXTURE3);
225-
glBindTexture(GL_TEXTURE_2D, BBoxmaxTex);
219+
glBindTexture(GL_TEXTURE_BUFFER, verticesTex);
226220
glActiveTexture(GL_TEXTURE4);
227-
glBindTexture(GL_TEXTURE_2D, vertexIndicesTex);
221+
glBindTexture(GL_TEXTURE_BUFFER, normalsTex);
228222
glActiveTexture(GL_TEXTURE5);
229-
glBindTexture(GL_TEXTURE_2D, verticesTex);
230-
glActiveTexture(GL_TEXTURE6);
231-
glBindTexture(GL_TEXTURE_2D, normalsTex);
232-
glActiveTexture(GL_TEXTURE7);
233223
glBindTexture(GL_TEXTURE_2D, materialsTex);
234-
glActiveTexture(GL_TEXTURE8);
224+
glActiveTexture(GL_TEXTURE6);
235225
glBindTexture(GL_TEXTURE_2D, transformsTex);
236-
glActiveTexture(GL_TEXTURE9);
226+
glActiveTexture(GL_TEXTURE7);
237227
glBindTexture(GL_TEXTURE_2D, lightsTex);
238-
glActiveTexture(GL_TEXTURE10);
228+
glActiveTexture(GL_TEXTURE8);
239229
glBindTexture(GL_TEXTURE_2D_ARRAY, textureMapsArrayTex);
240-
glActiveTexture(GL_TEXTURE11);
230+
glActiveTexture(GL_TEXTURE9);
241231
glBindTexture(GL_TEXTURE_2D, hdrTex);
242-
glActiveTexture(GL_TEXTURE12);
232+
glActiveTexture(GL_TEXTURE10);
243233
glBindTexture(GL_TEXTURE_2D, hdrMarginalDistTex);
244-
glActiveTexture(GL_TEXTURE13);
234+
glActiveTexture(GL_TEXTURE11);
245235
glBindTexture(GL_TEXTURE_2D, hdrConditionalDistTex);
246236
}
247237

src/shaders/common/anyhit.glsl

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ bool AnyHit(Ray r, float maxDist)
6262
continue;
6363
}
6464

65-
ivec2 index = ivec2(n >> 12, n & 0x00000FFF);
66-
ivec3 LRLeaf = texelFetch(BVH, index, 0).xyz;
65+
int index = n;
66+
ivec3 LRLeaf = ivec3(texelFetch(BVH, index * 3 + 2).xyz);
6767

6868
int leftIndex = int(LRLeaf.x);
6969
int rightIndex = int(LRLeaf.y);
@@ -73,15 +73,15 @@ bool AnyHit(Ray r, float maxDist)
7373
{
7474
for (int i = 0; i < rightIndex; i++) // Loop through indices
7575
{
76-
ivec2 index = ivec2((leftIndex + i) % vertIndicesSize, (leftIndex + i) / vertIndicesSize);
77-
ivec3 vert_indices = texelFetch(vertexIndicesTex, index, 0).xyz;
76+
int index = leftIndex + i;
77+
ivec3 vert_indices = ivec3(texelFetch(vertexIndicesTex, index).xyz);
7878

79-
vec3 v0 = texelFetch(verticesTex, ivec2(vert_indices.x >> 12, vert_indices.x & 0x00000FFF), 0).xyz;
80-
vec3 v1 = texelFetch(verticesTex, ivec2(vert_indices.y >> 12, vert_indices.y & 0x00000FFF), 0).xyz;
81-
vec3 v2 = texelFetch(verticesTex, ivec2(vert_indices.z >> 12, vert_indices.z & 0x00000FFF), 0).xyz;
79+
vec4 v0 = texelFetch(verticesTex, vert_indices.x);
80+
vec4 v1 = texelFetch(verticesTex, vert_indices.y);
81+
vec4 v2 = texelFetch(verticesTex, vert_indices.z);
8282

83-
vec3 e0 = v1 - v0;
84-
vec3 e1 = v2 - v0;
83+
vec3 e0 = v1.xyz - v0.xyz;
84+
vec3 e1 = v2.xyz - v0.xyz;
8585
vec3 pv = cross(r_trans.direction, e1);
8686
float det = dot(e0, pv);
8787

@@ -120,12 +120,8 @@ bool AnyHit(Ray r, float maxDist)
120120
}
121121
else
122122
{
123-
ivec2 lc = ivec2(leftIndex >> 12, leftIndex & 0x00000FFF);
124-
ivec2 rc = ivec2(rightIndex >> 12, rightIndex & 0x00000FFF);
125-
126-
leftHit = AABBIntersect(texelFetch(BBoxMin, lc, 0).xyz, texelFetch(BBoxMax, lc, 0).xyz, r_trans);
127-
rightHit = AABBIntersect(texelFetch(BBoxMin, rc, 0).xyz, texelFetch(BBoxMax, rc, 0).xyz, r_trans);
128-
123+
leftHit = AABBIntersect(texelFetch(BVH, leftIndex * 3 + 0).xyz, texelFetch(BVH, leftIndex * 3 + 1).xyz, r_trans);
124+
rightHit = AABBIntersect(texelFetch(BVH, rightIndex * 3 + 0).xyz, texelFetch(BVH, rightIndex * 3 + 1).xyz, r_trans);
129125

130126
if (leftHit > 0.0 && rightHit > 0.0)
131127
{

0 commit comments

Comments
 (0)