mirror of
https://github.com/overte-org/overte.git
synced 2025-08-07 20:13:40 +02:00
rewind all the unecessary changes and do just the minimum layout(std140) and accessing the big arrays in vec4s to fix the amd bug
This commit is contained in:
parent
7a97570949
commit
914fc7fca8
4 changed files with 25 additions and 29 deletions
|
@ -13,18 +13,18 @@
|
|||
|
||||
|
||||
struct FrustumGrid {
|
||||
mat4 eyeToGridProj;
|
||||
mat4 worldToEyeMat;
|
||||
mat4 eyeToWorldMat;
|
||||
float frustumNear;
|
||||
float rangeNear;
|
||||
float rangeFar;
|
||||
float frustumFar;
|
||||
vec4 dims;
|
||||
// float spare;
|
||||
ivec3 dims;
|
||||
float spare;
|
||||
mat4 eyeToGridProj;
|
||||
mat4 worldToEyeMat;
|
||||
mat4 eyeToWorldMat;
|
||||
};
|
||||
|
||||
uniform frustumGridBuffer {
|
||||
layout(std140) uniform frustumGridBuffer {
|
||||
FrustumGrid frustumGrid;
|
||||
};
|
||||
|
||||
|
@ -51,16 +51,20 @@ float projection_getFar(mat4 projection) {
|
|||
#define GRID_INDEX_TYPE ivec4
|
||||
#define GRID_FETCH_BUFFER(i) i / 4][i % 4
|
||||
<@else@>
|
||||
#define GRID_NUM_ELEMENTS 16384
|
||||
#define GRID_NUM_ELEMENTS 4096
|
||||
#define GRID_INDEX_TYPE ivec4
|
||||
#define GRID_FETCH_BUFFER(i) i / 4][i % 4
|
||||
|
||||
<!#define GRID_NUM_ELEMENTS 16384
|
||||
#define GRID_INDEX_TYPE int
|
||||
#define GRID_FETCH_BUFFER(i) i
|
||||
#define GRID_FETCH_BUFFER(i) i!>
|
||||
<@endif@>
|
||||
|
||||
uniform clusterGridBuffer {
|
||||
layout(std140) uniform clusterGridBuffer {
|
||||
GRID_INDEX_TYPE _clusterGridTable[GRID_NUM_ELEMENTS];
|
||||
};
|
||||
|
||||
uniform clusterContentBuffer {
|
||||
layout(std140) uniform clusterContentBuffer {
|
||||
GRID_INDEX_TYPE _clusterGridContent[GRID_NUM_ELEMENTS];
|
||||
};
|
||||
|
||||
|
|
|
@ -73,14 +73,14 @@ vec3 frustumGrid_eyeToVolume(vec3 epos, mat4 projection, float rangeNear, float
|
|||
|
||||
|
||||
int frustumGrid_numClusters() {
|
||||
return int(frustumGrid.dims.x) * int(frustumGrid.dims.y) * (int(frustumGrid.dims.z) + 1);
|
||||
return frustumGrid.dims.x * frustumGrid.dims.y * (frustumGrid.dims.z + 1);
|
||||
}
|
||||
|
||||
int frustumGrid_clusterToIndex(ivec3 pos) {
|
||||
return int(pos.x + (pos.y + pos.z * int(frustumGrid.dims.y)) * int(frustumGrid.dims.x));
|
||||
return pos.x + (pos.y + pos.z * frustumGrid.dims.y) * frustumGrid.dims.x;
|
||||
}
|
||||
ivec3 frustumGrid_indexToCluster(int index) {
|
||||
ivec3 summedDims = ivec3(int(frustumGrid.dims.x) * int(frustumGrid.dims.y), int(frustumGrid.dims.x), 1);
|
||||
ivec3 summedDims = ivec3(frustumGrid.dims.x * frustumGrid.dims.y, frustumGrid.dims.x, 1);
|
||||
int layer = index / summedDims.x;
|
||||
int offsetInLayer = index % summedDims.x;
|
||||
ivec3 clusterPos = ivec3(offsetInLayer % summedDims.y, offsetInLayer / summedDims.y, layer);
|
||||
|
@ -92,7 +92,7 @@ vec3 frustumGrid_clusterPosToEye(vec3 clusterPos) {
|
|||
vec3 cvpos = clusterPos;
|
||||
|
||||
|
||||
vec3 volumePos = frustumGrid_gridToVolume(cvpos, ivec3(frustumGrid.dims.x, frustumGrid.dims.y, frustumGrid.dims.z));
|
||||
vec3 volumePos = frustumGrid_gridToVolume(cvpos, frustumGrid.dims);
|
||||
|
||||
vec3 eyePos = frustumGrid_volumeToEye(volumePos, frustumGrid.eyeToGridProj, frustumGrid.rangeNear, frustumGrid.rangeFar);
|
||||
|
||||
|
@ -115,7 +115,7 @@ int frustumGrid_eyeDepthToClusterLayer(float eyeZ) {
|
|||
|
||||
float volumeZ = frustumGrid_eyeToVolumeDepth(eyeZ, frustumGrid.rangeNear, frustumGrid.rangeFar);
|
||||
|
||||
float gridZ = frustumGrid_volumeToGridDepth(volumeZ, ivec3(frustumGrid.dims.x, frustumGrid.dims.y, frustumGrid.dims.z));
|
||||
float gridZ = frustumGrid_volumeToGridDepth(volumeZ, frustumGrid.dims);
|
||||
|
||||
if (gridZ >= frustumGrid.dims.z) {
|
||||
gridZ = frustumGrid.dims.z;
|
||||
|
@ -137,7 +137,7 @@ ivec3 frustumGrid_eyeToClusterPos(vec3 eyePos) {
|
|||
vec3 volumePos = frustumGrid_eyeToVolume(eyePos, frustumGrid.eyeToGridProj, frustumGrid.rangeNear, frustumGrid.rangeFar);
|
||||
|
||||
|
||||
vec3 gridPos = frustumGrid_volumeToGrid(volumePos, ivec3(frustumGrid.dims.x, frustumGrid.dims.y, frustumGrid.dims.z));
|
||||
vec3 gridPos = frustumGrid_volumeToGrid(volumePos, frustumGrid.dims);
|
||||
|
||||
if (gridPos.z >= frustumGrid.dims.z) {
|
||||
gridPos.z = frustumGrid.dims.z;
|
||||
|
@ -149,7 +149,7 @@ ivec3 frustumGrid_eyeToClusterPos(vec3 eyePos) {
|
|||
|
||||
int frustumGrid_eyeToClusterDirH(vec3 eyeDir) {
|
||||
if (eyeDir.z >= 0.0f) {
|
||||
return (eyeDir.x > 0 ? int(frustumGrid.dims.x) : -1);
|
||||
return (eyeDir.x > 0 ? frustumGrid.dims.x : -1);
|
||||
}
|
||||
|
||||
float eyeDepth = -eyeDir.z;
|
||||
|
@ -163,7 +163,7 @@ int frustumGrid_eyeToClusterDirH(vec3 eyeDir) {
|
|||
|
||||
int frustumGrid_eyeToClusterDirV(vec3 eyeDir) {
|
||||
if (eyeDir.z >= 0.0f) {
|
||||
return (eyeDir.y > 0 ? int(frustumGrid.dims.y) : -1);
|
||||
return (eyeDir.y > 0 ? frustumGrid.dims.y : -1);
|
||||
}
|
||||
|
||||
float eyeDepth = -eyeDir.z;
|
||||
|
|
|
@ -21,20 +21,17 @@
|
|||
|
||||
class FrustumGrid {
|
||||
public:
|
||||
|
||||
glm::mat4 eyeToGridProj;
|
||||
glm::mat4 worldToEyeMat;
|
||||
glm::mat4 eyeToWorldMat;
|
||||
|
||||
float frustumNear { 0.1f };
|
||||
float rangeNear { 0.1f };
|
||||
float rangeFar { 200.0f };
|
||||
float frustumFar { 10000.0f };
|
||||
// glm::ivec4 dims { 1, 1, 1, 1 };
|
||||
|
||||
glm::ivec3 dims { 1, 1, 1 };
|
||||
float spare;
|
||||
|
||||
glm::mat4 eyeToGridProj;
|
||||
glm::mat4 worldToEyeMat;
|
||||
glm::mat4 eyeToWorldMat;
|
||||
|
||||
FrustumGrid() = default;
|
||||
FrustumGrid(const FrustumGrid& source);
|
||||
|
|
|
@ -58,11 +58,6 @@ void main(void) {
|
|||
|
||||
vec3 gridPos = frustumGrid_volumeToGrid(volumePos, dims);
|
||||
|
||||
_fragColor = vec4(fract(volumePos.xyz), 1.0);
|
||||
// _fragColor = vec4(fract(gridPos / vec3(dims)), 1.0);
|
||||
|
||||
return;
|
||||
|
||||
ivec3 cluster = clusterGrid_getCluster(frustumGrid_clusterToIndex(clusterPos));
|
||||
|
||||
int numLights = cluster.x + cluster.y;
|
||||
|
|
Loading…
Reference in a new issue