Đối với toán học cong vênh thực tế, điều này có thể trở nên rất phức tạp, tại sao bạn không bắt đầu ở đây? .
Bây giờ tôi sẽ nói về cách bạn có thể áp dụng điều này, giả sử bạn đã có toán cho cách bạn sẽ làm biến dạng của bạn xuống.
2 cách:
1) Mỗi khung hình, truy cập mọi đỉnh trong mô hình hình trụ và bù nó theo một cách nào đó.
2) Bù đắp các đỉnh trong shader đỉnh như bạn đang kết xuất. OpenGL ES 2.0 hỗ trợ trình tạo bóng đỉnh. Vì vậy, bạn đang gặp may mắn.
Bạn có muốn chỉ làm cong vênh đối tượng khi nó xuất hiện trên màn hình , hay bạn muốn làm cong vênh đối tượng để mọi đối tượng trong trò chơi biết rằng nó đã bị biến dạng?
Nếu bạn làm cong đối tượng trong shader đỉnh, thì điều đó chỉ xảy ra ngay trước khi hiển thị / rasterization , vì vậy điều này có nghĩa là không ai trong số các đối tượng trò chơi sẽ biết về biến dạng . Điều này tốt nếu bạn chỉ đơn giản là thực hiện một trình bảo vệ màn hình hoặc nếu các biến dạng quá nhỏ đến mức chúng không có tác động đến hình dạng có thể va chạm của vật thể.
Khi bạn làm cong hình học trong shader đỉnh, các đỉnh ban đầu của mô hình thực sự không di chuyển , (chúng chỉ xuất hiện để di chuyển ).
Biến dạng trong shader đỉnh
Không định dạng:
Biến dạng
Đây là từ chương 6 của hướng dẫn cg , (chương trình # 14).
Mã shader để tạo ra biến dạng này là một cái gì đó như
// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;
// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;
// move the vertex
float4 newPosition = position + displacement * displacementDirection ;
// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;
Vì vậy, bạn có thể thấy, điều này xảy ra hiển thị RIGHT BEFORE (shader đỉnh xảy ra trên GPU) vì vậy mã CPU thực tế không có cách nào để truy cập vị trí đỉnh đã chuyển đổi (có nhiều cách để gửi dữ liệu từ GPU đến CPU (chủ yếu thông qua kết cấu) nhưng chúng tôi sẽ không đến đó).