2012-05-09 14 views
5

Trên một thẻ NVIDIA tôi có thể thực hiện đầy đủ cảnh antialiasing bằng cách sử dụng một cái gì đó tích lũy đệm như thế này:khử răng cưa OpenGL mà không có sự tích lũy đệm

if(m_antialias) 
{ 
    glClear(GL_ACCUM_BUFFER_BIT); 
    for(int j = 0; j < antialiasing; j++) 
    { 
     accPerspective(m_camera.FieldOfView(), // Vertical field of view in degrees. 
      aspectratio, // The aspect ratio. 
      20., // Near clipping 
      1000., 
      JITTER[antialiasing][j].X(), JITTER[antialiasing][j].Y(), 
      0.0, 0.0, 1.0); 

     m_camera.gluLookAt(); 

     ActualDraw(); 

     glAccum(GL_ACCUM, float(1.0/antialiasing)); 

     glDrawBuffer(GL_FRONT); 
     glAccum(GL_RETURN, float(antialiasing)/(j + 1)); 
     glDrawBuffer(GL_BACK); 
    } 

    glAccum(GL_RETURN, 1.0); 
} 

Mở thẻ ATI bộ đệm tích lũy được không được thực hiện, và mọi người đều nói rằng bạn có thể làm điều đó trong ngôn ngữ đổ bóng ngay bây giờ. Vấn đề với điều đó, tất nhiên, là GLSL là một rào cản khá cao để nhập cho một người mới bắt đầu OpenGL.

Bất cứ ai có thể chỉ cho tôi điều gì đó sẽ chỉ cho tôi cách thực hiện chống răng cưa toàn cảnh theo cách thẻ ATI có thể làm và người mới có thể hiểu không?

Trả lời

14

Tại sao bạn lại làm chống răng cưa theo cách này, bất kể bạn có bộ đệm tích lũy hay không? Chỉ cần sử dụng multisampling; nó không miễn phí, nhưng nó rẻ hơn nhiều so với những gì bạn đang làm.

Trước tiên, bạn phải tạo ngữ cảnh bằng bộ đệm được lấy mẫu nhiều lần. Điều đó có nghĩa là bạn cần sử dụng WGL/GLX_ARB_multisample, có nghĩa là trên Windows, bạn cần phải thực hiện two-stage context creation. Bạn nên yêu cầu định dạng pixel với 1 *_SAMPLE_BUFFERS_ARB và một số số *_SAMPLES_ARB. Số lượng mẫu càng lớn thì việc chống răng cưa càng tốt (cũng chậm hơn). Bạn có thể nhận được số lượng mẫu tối đa với wglGetPixelFormatAttribfv hoặc glXGetConfig.

Khi bạn đã tạo thành công một ngữ cảnh với một bộ đệm khung mẫu, bạn sẽ hiển thị như bình thường, với một ngoại lệ: gọi glEnable(GL_MULTISAMPLE) trong mã thiết lập của bạn. Điều này sẽ kích hoạt hiển thị đa kết nối.

Và đó là tất cả những gì bạn cần.

Hoặc, nếu bạn đang sử dụng GL 3.x hoặc có quyền truy cập vào ARB_framebuffer_object, bạn có thể bỏ qua nội dung ngữ cảnh và tạo bộ đệm khung hình đa khung. Bộ đệm độ sâu và bộ đệm màu của bạn phải có cùng số lượng mẫu. Tôi sẽ đề nghị cho những điều này, vì bạn vẫn đang sử dụng hàm cố định (và bạn không thể kết cấu từ kết cấu nhiều mẫu trong đường ống hàm cố định).

Bạn tạo biểu tượng kết xuất vừa tạo vừa lấy mẫu cho màu sắc và chiều sâu (chúng phải có cùng số lượng mẫu). Bạn thiết lập chúng trong một FBO, và render vào chúng (với glEnable(GL_MULTISAMPLE), tất nhiên). Khi bạn hoàn tất, sau đó bạn sử dụng glBlitFramebuffer để trích xuất từ ​​bộ đệm khung nhiều mẫu của bạn vào bộ đệm sau (không được ghép nối nhiều lần).

Vấn đề với điều đó, tất nhiên, đó là GLSL là rào cản khá cao đối với mục nhập cho người mới bắt đầu OpenGL.

Nói ai? Không có gì sai với một người mới bắt đầu học tập từ shaders. Thật vậy, theo kinh nghiệm của tôi, những người mới bắt đầu thường học tốt hơn, bởi vì họ hiểu chi tiết về những gì đang diễn ra hiệu quả hơn.

+2

"Tại sao bạn lại làm chống răng cưa theo cách này" Đây là một kỹ thuật rất cũ từ phiên bản sổ đỏ OpenGL 1. Xét theo hiệu suất của bộ đệm tích lũy, tôi nghi ngờ toàn bộ điều này hoàn toàn không được đánh giá - ngay cả trên nvidia. Tôi nghĩ rằng sổ đỏ cũng có "độ sâu trường" hoặc một số hiệu ứng tương tự được thực hiện bằng cách sử dụng bộ đệm tích lũy ... – SigTerm

+0

"Ngoài ra, nếu bạn đang sử dụng GL 3.x hoặc có quyền truy cập vào ARB_framebuffer_object, bạn có thể bỏ qua nội dung và tạo một bộ đệm khung hình đa khung. " Hoặc EXT_framebuffer_multisample. – JWWalker

+0

"Tại sao ..." Tôi không biết đây là một cách khủng khiếp để hoàn thành công việc.Có thể tôi đang đến đây từ một viễn cảnh hiếm hoi, nhưng tôi nghi ngờ rằng tôi là người duy nhất. Tôi không đặc biệt quan tâm đến công cụ GL cho đến khi CL/CUDA xuất hiện. Với bối cảnh GL/CL được chia sẻ, khả năng thực hiện các phép tính trên các mảng, và sau đó chúng được xử lý như các đối tượng đệm vertex hoặc kết cấu như vậy mà bạn thực sự có thể thể hiện trực quan các tính toán tốc độ cao của bạn. –

Các vấn đề liên quan