19 lines
		
	
	
		
			594 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			19 lines
		
	
	
		
			594 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const vec3 clusterSlices = vec3(16, 16, 16);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int getClusterI(vec2 tc, float viewz, vec2 cameraPlane) {
							 | 
						||
| 
								 | 
							
									int sliceZ = 0;
							 | 
						||
| 
								 | 
							
									float cnear = clusterNear + cameraPlane.x;
							 | 
						||
| 
								 | 
							
									if (viewz >= cnear) {
							 | 
						||
| 
								 | 
							
										float z = log(viewz - cnear + 1.0) / log(cameraPlane.y - cnear + 1.0);
							 | 
						||
| 
								 | 
							
										sliceZ = int(z * (clusterSlices.z - 1)) + 1;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									// address gap between near plane and cluster near offset
							 | 
						||
| 
								 | 
							
									else if (viewz >= cameraPlane.x) {
							 | 
						||
| 
								 | 
							
										sliceZ = 1;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return int(tc.x * clusterSlices.x) +
							 | 
						||
| 
								 | 
							
										   int(int(tc.y * clusterSlices.y) * clusterSlices.x) +
							 | 
						||
| 
								 | 
							
										   int(sliceZ * clusterSlices.x * clusterSlices.y);
							 | 
						||
| 
								 | 
							
								}
							 |