parallax occlusion
This commit is contained in:
		
							parent
							
								
									56e31c4afa
								
							
						
					
					
						commit
						14304a843a
					
				@ -64,7 +64,7 @@ struct Material
 | 
				
			|||||||
    alignas(16) glm::vec3 ks; // коэф. зеркального блика
 | 
					    alignas(16) glm::vec3 ks; // коэф. зеркального блика
 | 
				
			||||||
    float p; // показатель глянцевости
 | 
					    float p; // показатель глянцевости
 | 
				
			||||||
    int normalmapped; // Использование карт нормалей
 | 
					    int normalmapped; // Использование карт нормалей
 | 
				
			||||||
    bool parallaxmapped; // Использование параллакса
 | 
					    int parallaxmapped; // Использование параллакса
 | 
				
			||||||
    // Значения по умолчанию
 | 
					    // Значения по умолчанию
 | 
				
			||||||
    Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1), normalmapped(false), parallaxmapped(false) { };
 | 
					    Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1), normalmapped(false), parallaxmapped(false) { };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -28,7 +28,7 @@ uniform sampler2D tex_specular;
 | 
				
			|||||||
uniform sampler2D tex_heights;
 | 
					uniform sampler2D tex_heights;
 | 
				
			||||||
uniform sampler2D tex_normal;
 | 
					uniform sampler2D tex_normal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uniform float parallax_heightScale = 0.03;
 | 
					uniform float parallax_heightScale = 0.1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void main()
 | 
					void main()
 | 
				
			||||||
{    
 | 
					{    
 | 
				
			||||||
@ -44,9 +44,42 @@ void main()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (parallaxmapped)
 | 
					    if (parallaxmapped)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        float height = 1.0 - texture(tex_heights, texCoord).r;
 | 
					        // Число слоев
 | 
				
			||||||
        new_texCoord -= viewTBN.xy* (height * parallax_heightScale); 
 | 
					        float layersCount = 32;  
 | 
				
			||||||
 | 
					        // Вычислим размер каждого слоя
 | 
				
			||||||
 | 
					        float layerDepth = 1.0 / layersCount;
 | 
				
			||||||
 | 
					        // Глубина текущего слоя
 | 
				
			||||||
 | 
					        float currentLayerDepth = 0.0;
 | 
				
			||||||
 | 
					        // Величина сдвига между слоями
 | 
				
			||||||
 | 
					        vec2 deltaTexCoords = (parallax_heightScale * viewTBN.xy / viewTBN.z) / layersCount;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					        // Переменные для вычислений
 | 
				
			||||||
 | 
					        vec2  currentTexCoords     = texCoord;
 | 
				
			||||||
 | 
					        float currentDepthMapValue = 1.0 - texture(tex_heights, currentTexCoords).r;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        // Пока глубина текущего слоя меньше текущего значения глубины из текстуры 
 | 
				
			||||||
 | 
					        while(currentLayerDepth < currentDepthMapValue)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // Сдвигаем координаты
 | 
				
			||||||
 | 
					            currentTexCoords -= deltaTexCoords;
 | 
				
			||||||
 | 
					            // Обновляем значение глубины из текстуры
 | 
				
			||||||
 | 
					            currentDepthMapValue = 1.0 - texture(tex_heights, currentTexCoords).r;  
 | 
				
			||||||
 | 
					            // Сдвигаем глубину на следующий слой
 | 
				
			||||||
 | 
					            currentLayerDepth += layerDepth;  
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        // Получим значение текстурных координат с предыдущего шага
 | 
				
			||||||
 | 
					        vec2 prevTexCoords = currentTexCoords + deltaTexCoords;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Значения глубины до и после пересечения
 | 
				
			||||||
 | 
					        float afterDepth  = currentDepthMapValue - currentLayerDepth;
 | 
				
			||||||
 | 
					        float beforeDepth = 1.0 - texture(tex_heights, prevTexCoords).r - currentLayerDepth + layerDepth;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					        // Интерполяция текстурных координат
 | 
				
			||||||
 | 
					        float weight = afterDepth / (afterDepth - beforeDepth);
 | 
				
			||||||
 | 
					        new_texCoord = prevTexCoords * weight + currentTexCoords * (1.0 - weight);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Проверка диапазона [0;1]
 | 
				
			||||||
        if(new_texCoord.x > 1.0 || new_texCoord.y > 1.0 || new_texCoord.x < 0.0 || new_texCoord.y < 0.0)
 | 
					        if(new_texCoord.x > 1.0 || new_texCoord.y > 1.0 || new_texCoord.x < 0.0 || new_texCoord.y < 0.0)
 | 
				
			||||||
            discard;
 | 
					            discard;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user