Vẽ đường viền xung quanh đối tượng trong Opengl


8

Tôi cần vẽ đường viền xung quanh các đối tượng 2d trong không gian 3d. Tôi đã thử vẽ các đường xung quanh đối tượng (+ điểm để lấp đầy khoảng trống), nhưng do độ rộng của đường, một phần của nó (~ 50%) đã che đối tượng. Tôi đã cố gắng sử dụng bộ đệm stpson, để loại bỏ vấn đề này, nhưng tôi đã nhận được sth như thế này (đường viền là màu xanh lá cây):

http://goo.gl/OI5uc (xin lỗi tôi không thể đăng ảnh, vì danh tiếng của tôi)

Bạn có thể thấy (trong đó các điểm mũi tên), rằng một số phần của dòng nằm phía sau đối tượng và một số ở trên. Điều này thay đổi khi tôi di chuyển máy ảnh, nhưng luôn có một phần, đó là che nó. Đây là mã, mà tôi sử dụng để vẽ đối tượng:

    glColorMask(1,1,1,1);
    std::list<CObjectOnScene*>::iterator objIter=ptr->objects.begin(),objEnd=ptr->objects.end();
    int countStencilBit=1;
    while(objIter!=objEnd)
    {
        glColorMask(1,1,1,1);
        glStencilFunc(GL_ALWAYS,countStencilBit,countStencilBit);
        glStencilOp(GL_REPLACE,GL_KEEP,GL_REPLACE );
        (*objIter)->DrawYourVertices();

        glStencilFunc(GL_NOTEQUAL,countStencilBit,countStencilBit);
        glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
        (*objIter)->DrawYourBorder();

        ++objIter;
        ++countStencilBit;
    }

Tôi đã thử các cài đặt khác nhau của bộ đệm stpson, nhưng tôi luôn cảm thấy như vậy. Đây là câu hỏi: 1.Am tôi cài đặt bộ đệm stpson sai?

2. Có cách nào đơn giản khác để tạo đường viền trên các đối tượng đó không?

Cảm ơn trước.

BIÊN TẬP:

1. Tôi không có quy tắc của các đối tượng.

2. Vật có thể lõm.

3. Tôi không thể sử dụng shader (xem bên dưới tại sao).


Bạn có thể kiểm tra 'toon' hoặc bóng di động, nơi có một đường viền được vẽ xung quanh một đối tượng. lighthouse3d.com/tutorials/glsl-tutorial/?toon .
Jonathan Connell

Trường hợp là, tôi không thể sử dụng shader trong dự án này ...
Therealszaka

@Maciekp Tại sao bạn không thể sử dụng shader? Đây có phải là bài tập về nhà không?
Jonathan Connell

Ứng dụng này sẽ phải hoạt động trên nhiều máy tính, không phải lúc nào cũng là ứng dụng mới nhất (đó là 1 điểm) .2. Nó không phải là một trò chơi, đây là ứng dụng có đồ họa như một phần của nó + nó sẽ phải hoạt động trên mac, win, linux.
Therealszaka

1
Nó có thể đã được đăng trên SO nếu nó không dành cho GameDev và bạn nên cung cấp nhiều thông tin nhất có thể nếu bạn muốn câu hỏi của mình được trả lời.
Jonathan Connell

Câu trả lời:


12
  • Vẽ toàn bộ cảnh của bạn, ngoại trừ các đối tượng được tô sáng.
  • Vẽ các đối tượng bạn muốn làm nổi bật, bằng màu thuần túy, được sắp xếp từ sau ra trước và với tỷ lệ nhỏ được áp dụng (1.05f - 1.1f).
  • Vẽ các đối tượng cuối cùng, một lần nữa, từ sau ra trước.

Để có thêm mắt, hãy thử vẽ đường viền cho mục tiêu kết xuất riêng biệt và áp dụng một vệt mờ nhỏ, sau đó trộn kết cấu này với cảnh cuối cùng của bạn bằng cách sử dụng các giá trị Z thích hợp.


Đây là một trò lừa Barba tuyệt vời!
FxIII

Đây là thủ thuật cũ mà họ đã sử dụng để phác thảo khi đường ống gfx vẫn được sửa.
Jonathan Connell

2
Điều đó sẽ không làm việc cho các vật thể lõm
Therealszaka

@Maciekp Câu hỏi của bạn là về các vật thể 2D (mặt phẳng) trong không gian 3D, nơi lõm vào trong đó? Chỉ cần chia tỷ lệ dọc theo hai trục! = Theo hướng mặt.
Jonathan Connell

sẽ hoạt động cho các đối tượng lõm nếu bạn đảo ngược các quy tắc (bạn phải bật tính năng loại bỏ khuôn mặt) trong khi vẽ các đường viền.
r2d2rigo

0

Tôi sẽ làm như thế này:

  • Sắp xếp các đối tượng theo thứ tự phía trước (khoảng cách từ camera)

  • Vẽ đường viền của đối tượng (dưới dạng đường và điểm) bị vô hiệu hóa GL_DEPTH_TEST

  • Vẽ đối tượng có bật GL_DEPTH_TEST

  • Thực hiện hai bước cuối cùng cho mọi đối tượng

Tôi sẽ cố gắng làm điều này như thế, nhưng nếu có ai có ý tưởng về giải pháp tốt hơn cho vấn đề này (MỤC TIÊU XÁC NHẬN, XIN VUI LÒNG) - vui lòng chia sẻ với chúng tôi.

Tái bút Tôi không hoàn toàn hài lòng với các trạng thái OpenGL thay đổi giải pháp của mình nên thường có thể gây hại. Nhưng nếu không ai có thể giúp tôi cài đặt bộ đệm stpson, tôi đoán đó là cách duy nhất cho tôi.

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.