Tôi chắc chắn không khuyên bạn nên vẽ vòng tròn thông qua hình học. Nó có hai nhược điểm chính:
- Nó chậm. Nếu bạn muốn có độ chính xác chấp nhận được, bạn cần rất nhiều đỉnh và bất kỳ đỉnh nào trong số các đỉnh này cần được xử lý trong trình đổ bóng. Đối với một vòng tròn thực, bạn cần nhiều đỉnh vì vòng tròn của bạn có pixel.
- Nó không thực sự linh hoạt. Có các vòng tròn khác nhau, tạo kiểu và làm cho chúng trở nên khó nắm vững.
Có một phương pháp khác mà cá nhân tôi sử dụng trong mọi API đồ họa. Hiển thị ít nhất một hình tam giác hoặc sqare/quad và sử dụng trình đổ bóng phân đoạn để chỉ hiển thị pixel bị bỏ qua (dựa trên phương trình). Nó rất dễ hiểu. Nó rất linh hoạt và nhanh chóng.Nó cần pha trộn, nhưng điều này không thực sự khó để làm việc.
Các bước:
Khởi tạo bộ đệm của bạn bằng dữ liệu. Bạn cần một bộ đệm đỉnh cho các đỉnh, một bộ đệm chỉ mục cho các chỉ mục nếu bạn đang sử dụng một hình vuông và một bộ đệm textureCoord cho các tọa độ kết cấu của bạn. Đối với một hình vuông, tôi khuyên bạn nên sử dụng -1.0 là thấp nhất và 1,0 là tọa độ kết cấu cao nhất, vì sau đó bạn có thể sử dụng phương trình vòng tròn đơn vị.
Trong fragment-shader của bạn, sử dụng một cái gì đó như thế này:
if ((textureCoord.x * textureCoord.x) + (textureCoord.y * textureCoord.y) <= 1.0)
{
// Render colored and desired transparency
}
else
{
// Render with 0.0 in alpha channel
}
Trong khi (textureCoord.x * textureCoord.x) + (textureCoord.y * textureCoord.y) < = 1.0 là sự bất bình đẳng, bởi vì bạn cần một vòng tròn, bạn phải render mọi pixel trong phạm vi đó, không chỉ là đường viền. Bạn có thể thay đổi điều này để nó cung cấp cho bạn đầu ra mong muốn.
Và đó là nó. Không phải rất phức tạp để triển khai, vì vậy tôi không cung cấp bất kỳ mã hiển thị cơ bản nào ở đây. Tất cả những gì bạn cần xảy ra trong phần đổ bóng.
Nguồn
2014-12-24 11:01:18
Thank cho mã của bạn nhưng tôi sử dụng OpenGL ES 2, và tôi không thể thực hiện của bạn mã. Làm thế nào để nó trong OPENGL ES 2? –
Tất nhiên điều này làm việc với es es 2. Nếu bạn hiểu mã và bạn không biết làm thế nào để áp dụng nó cho opengl es 2.0, bạn nên tìm một số hướng dẫn cơ bản về 2.0 làm thế nào để render một vbo đơn giản. – Dirk
Đây là mã của tôi để có được các vòng tròn của một vòng tròn: –