Tôi có một shader rất đơn giản và thêm sương mù tuyến tính thông qua hỗn hợp như thế này:
finalColor = mix(finalColor, vec3(0.5, 0.8, 0.95), vUVoutAndViewZ.z);
Lưu ý rằng khoảng cách Z của chế độ xem nằm trong biến cũng chứa tọa độ UV, do đó sương mù thậm chí không thêm một bộ nội suy mới.
Tuy nhiên, dòng vô hại này đã mang lại tốc độ khung hình trên OG Droid với chipset Power SGX từ 33fps đến 22fps. Ngay cả HTC Evo với GPU Adreno 200 vẫn ở mức dưới 30 khung hình / giây. (Adreno 205 ở tốc độ 60fps không đổi, nhưng thứ đó là một con thú).
Bản thân shader mảnh là nguyên thủy (tất cả các giá trị được mã hóa cứng vì nó là shader thử nghiệm):
precision mediump float;
varying mediump vec3 vUVoutAndViewZ;
varying lowp vec3 vNormalOut;
uniform lowp sampler2D diffuse;
void main() {
lowp vec3 normal = vNormalOut;
// Lighting
lowp vec3 lightDir = vec3(0.5, 0.3, 0.5);
lowp vec3 light = vec3(dot(normal, lightDir));
lowp vec3 diffuse = texture2D(diffuse, vUVoutAndViewZ.xy).rgb;
lowp vec3 finalColor = diffuse * light;
// Fog
finalColor = mix(finalColor, vec3(0.5, 0.8, 0.95), vUVoutAndViewZ.z);
gl_FragColor = vec4(finalColor.xyz, 1.0);
}
Tôi đã thêm các khai báo lowp / Mediump sau (thêm khoảng 2fps), nó hoạt động như là không có chúng.
Tôi từ chối tin rằng chipset PowerVR yếu đến mức nó không thể xử lý một shader đơn giản như thế này. Phải có một cái gì đó ngu ngốc trong shader này (giống như một cái gì đó ngầm ẩn một thanh ghi lowp) hoàn toàn làm rối tung đơn vị.
TRẢ LỜI và EDIT:
Ellis có một số thông tin tuyệt vời trong câu trả lời và các ý kiến tiếp theo. Trong trường hợp cụ thể này, có vẻ như mix () bị phá vỡ. Nó đưa shader đến 12 chu kỳ (từ 4) và 4 GPR (từ 2). Tôi đã quay lại 29fps bằng cách sử dụng mã này thay thế:
lowp vec3 fogDiff = vec3(0.5, 0.8, 0.95) - finalColor;
fogDiff *= vUVoutAndViewZ.z;
finalColor += fogDiff;
mix()
giết chết khung hình như thế nào , tôi không quá thiên về ném vào pow
để hoàn thành nó.