Thêm một hỗn hợp đơn giản () sẽ phá hủy khung hình


7

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;

Bạn có biết rằng sương mù không tuyến tính với độ sâu? Nếu bạn không sợ thêm chức năng pow vào shader, tôi nghĩ bạn nên cố gắng làm cho nó thực tế hơn;)
Notabene

@notabene: Tôi biết điều đó, nhưng vì bài đăng này nói về việc một người đơn giản 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ó.
EboMike

Câu trả lời:


5

Phản hồi từ EboMike được tính toán với PVRUniSCo Editor: mix () đưa shader từ 4 chu kỳ lên 12 chu kỳ (PowerVR).

PowerVR 530/535 rất chậm. Andreno 200 và PowerVR 530/535 là thế hệ GPU đầu tiên (OpenGL ES 2.x) cho độ phân giải hdpi. Bạn không thể vẽ lại toàn màn hình ở 60FPS với kết cấu đơn giản.

Tôi đã viết GPUBench để kiểm tra hiệu năng của shader và nó rất tệ trên các GPU này. Thế hệ thứ hai (Andreno 205, Powervr 540) tốt hơn nhiều.

Hôm nay, tôi cố gắng giảm thiểu mảnh vỡ mảnh bằng một hoặc hai thao tác. Bạn có thể cố gắng tối ưu hóa trình đổ bóng của mình vì trình biên dịch GLSL rất tệ (trên nền tảng di động).

Lưu ý: đối với gpu powervr, hãy đọc tài liệu này . PVRUniSCo Editor có thể tính toán các chu kỳ được sử dụng trong shader.

Những khó khăn của tôi:

  • GPU Droid chậm hơn Andreno 200 vì được lấp đầy
  • 30 FPS cho Andreno 200 là tốt
  • 20 FPS cho Droid là tốt
  • Bạn có thể kết xuất cảnh của mình trong một FBO nhỏ hơn và vẽ nó trên màn hình (nhưng chuyển đổi FBO rất tốn kém)
  • Mảnh vỡ mảnh phải rất ngắn.

Bạn đang phá vỡ trái tim tôi! Còn HTC Evo thì sao? Adreno 200 ít nhất có thể xử lý điều đó không? Ngay cả đối với một GPU yếu, điều đó có vẻ thảm hại vô lý.
EboMike

Mục tiêu của tôi là ít nhất 30 khung hình / giây cho Droid và EVO. Tôi mơ hồ nhớ các game như Backbreaker mà SEEM trông khá đẹp mắt (được một thời gian kể từ khi tôi nhìn thấy nó, tôi có thể sai). Bí mật ở đây là gì? Tôi không có quá nhiều tiền, tôi hầu như không sử dụng pha trộn alpha, và shader này là nguyên thủy. Bạn còn ý kiến ​​nào không? (Btw, sẽ chấp nhận câu trả lời sau vài giờ, đừng lo lắng :))
EboMike

30 FPS cho Droid hoặc EVO là rất khó. Những GPU này có tỷ lệ lấp đầy rất thấp.
Ellis

Tôi không biết gì về chipset đồ họa di động, nhưng tôi không thể nhận ra rằng bạn đã không giải thích phần thú vị nhất. Tại sao một dòng duy nhất giảm hiệu suất đáng kể? Là nó thực sự hoạt động hỗn hợp chậm?
Nevermind

2
Tôi chưa thử nhưng bạn có thể xem "Trình chỉnh sửa PVRUniSCo" cho các chu trình hướng dẫn GLSL.
Ellis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.