Tôi đang tạo địa hình được lập bản đồ địa hình. Cho đến nay tôi có nó hoạt động khá tốt. Tessellation địa hình gần máy ảnh là rất cao và được ít hơn để tiếp tục ra hình học. Hình dạng của địa hình chủ yếu theo sau camera và lấy mẫu một kết cấu độ cao dựa trên vị trí của các đỉnh. Bởi vì tessellation hình học là rất cao, đôi khi bạn có thể nhìn thấy mỗi điểm ảnh trong kết cấu khi lấy mẫu của nó. Nó tạo ra các điểm ảnh rõ ràng. Tôi nghĩ rằng tôi có thể làm được điều này bằng cách làm mịn lấy mẫu của bản đồ chiều cao. Tuy nhiên tôi dường như có một vấn đề lạ liên quan đến một số mã lấy mẫu bilinear. Tôi đang vẽ địa hình bằng cách di chuyển từng đỉnh theo kết cấu độ cao. Để có được chiều cao của một đỉnh tại một UV được phối hợp tôi có thể sử dụng:GLSL Vertex shader bilinear lấy mẫu chiều cao lấy mẫu
vec2 worldToMapSpace(vec2 worldPosition) {
return (worldPosition/worldScale + 0.5);
}
float getHeight(vec3 worldPosition)
{
#ifdef USE_HEIGHTFIELD
vec2 heightUv = worldToMapSpace(worldPosition.xz);
vec2 tHeightSize = vec2(HEIGHTFIELD_SIZE_WIDTH, HEIGHTFIELD_SIZE_HEIGHT); //both 512
vec2 texel = vec2(1.0/tHeightSize);
//float coarseHeight = texture2DBilinear(heightfield, heightUv, texel, tHeightSize).r;
float coarseHeight = texture2D(heightfield, vUv).r;
return altitude * coarseHeight + heightOffset;
#else
return 0.0;
#endif
}
nào sản xuất này (chú ý làm thế nào bạn có thể thấy mỗi pixel):
Đây là một wireframe:
Tôi muốn lấy mẫu địa hình mượt mà hơn. Vì vậy, tôi figured tôi có thể sử dụng một số lấy mẫu bilinear thay vì các tiêu chuẩn texture2D chức năng. Vì vậy, đây là chức năng lấy mẫu Bilinear tôi:
vec4 texture2DBilinear(sampler2D textureSampler, vec2 uv, vec2 texelSize, vec2 textureSize)
{
vec4 tl = texture2D(textureSampler, uv);
vec4 tr = texture2D(textureSampler, uv + vec2(texelSize.x, 0.0));
vec4 bl = texture2D(textureSampler, uv + vec2(0.0, texelSize.y));
vec4 br = texture2D(textureSampler, uv + vec2(texelSize.x, texelSize.y));
vec2 f = fract(uv.xy * textureSize); // get the decimal part
vec4 tA = mix(tl, tr, f.x);
vec4 tB = mix(bl, br, f.x);
return mix(tA, tB, f.y);
}
Các texelSize được tính như kích thước 1/heightmap:
vec2 texel = vec2(1.0/tHeightSize);
và textureSize là chiều rộng và chiều cao của heightmap. Tuy nhiên, khi tôi sử dụng chức năng này tôi nhận được kết quả này:?
float coarseHeight = texture2DBilinear(heightfield, heightUv, texel, tHeightSize).r;
Đó bây giờ có vẻ tồi tệ hơn :(Bất kỳ ý tưởng những gì tôi có thể làm sai Hoặc làm thế nào tôi có thể nhận được một mẫu địa hình mượt mà
EDIT
đây là một ảnh chụp màn hình thẳng đứng nhìn xuống địa hình. Bạn có thể thấy các lớp hoạt động tốt. Chú ý tuy nhiên đó các lớp bên ngoài có ít triangulation và trông mượt mà hơn trong khi những người có tessellation cao hơn hiển thị từng pixel. Tôi đang cố gắng tìm cách để làm mịn mẫu lấy mẫu.
Tại sao bạn sử dụng nội suy tuyến tính tùy chỉnh ở vị trí đầu tiên? Nếu mỗi đỉnh có một pixel trong bản đồ chiều cao, bạn nên sử dụng Gauss-Blur trên texture để làm cho nó 'mượt mà'. Nếu bạn có nhiều đỉnh hơn pixel, nội suy kết cấu dựng sẵn sẽ thực hiện công việc. – dari
Hi dari, Im sẽ phải chỉnh sửa câu hỏi của tôi để làm rõ. Lý do là bởi vì tôi đang sử dụng một kỹ thuật geoclipmapping. Địa hình gần camera là một cái nhìn rất cao. Bởi vì tessellation quá cao, có nhiều hình tam giác hơn có pixel. Vì vậy, nó không phải là một tỷ lệ 1-1. tức là việc lấy mẫu cần phải tốt hơn, hoặc đúng hơn là cần phải nội suy giữa các giá trị pixel. – Mat
Và tại sao bạn không sử dụng bản dựng trong nội suy? https: //www.opengl.org/wiki/Sampler_Object # Lấy mẫu_parameters – dari