2012-10-25 19 views
7

Tôi đã có một số mã 3D mà tôi nhận thấy sẽ không hiển thị trong cấu hình cốt lõi nghiêm ngặt nhưng tốt trong ngữ cảnh tiểu sử "bình thường" (không được yêu cầu một cách rõ ràng). Để cô lập vấn đề này, tôi đã viết nhỏ nhất đơn giản nhất có thể vẽ chương trình OpenGL chỉ là một hình tam giác và một hình chữ nhật:Làm cách nào để tạo mã OpenGL đơn giản này (hoạt động trong hồ sơ "khoan dung" 3.3 và 4.2) hoạt động trong cấu hình lõi 3.2 và 4.2 nghiêm ngặt?

enter image description here

Tôi đã đăng tải rằng chương trình OpenGL as a Gist here.

Với bộ biến useStrictCoreProfile false, chương trình kết quả đầu ra không có thông báo lỗi ra cửa sổ Console và vẽ một quad và một hình tam giác theo các ảnh chụp màn hình trên, cả hai trên một tích hợp Intel HD OpenGL 3.3 và trên một GeForce với OpenGL 4.2 .

Tuy nhiên, với useStrictCoreProfile set là true, nó xóa màu nền nhưng không vẽ tri & quad, giao diện điều khiển đầu ra là thế này:

GLCONN: OpenGL 3.2.0 @ NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 (GLSL: 1.50 NVIDIA via Cg compiler) 
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION 
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION 
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION 
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION 
LASTERR: OpenGL error at step '(post loop)': GL_INVALID_OPERATION 
EXIT 

... nếu một lõi nghiêm ngặt 4.2 hồ sơ được yêu cầu thay vì 3.2, cùng một vấn đề. Áp dụng cho 3 GPU nvidia khác nhau nên tôi cho rằng tôi không phù hợp với cấu hình cốt lõi nghiêm ngặt. Tôi đã làm gì sai, và làm thế nào tôi có thể sửa lỗi này?

Lưu ý, bạn sẽ không tìm thấy một glEnableVertexAttribArray cuộc gọi trong Gist trên, vì nó là inside the glutil package Tôi đang nhập khẩu - nhưng điều này không được gọi là bước cuối cùng trong compileShaders của ý chính() func.

+1

Các bạn đã cố gắng sử dụng phần mở rộng GL_ARB_debug_output để có được các thông báo lỗi có ích hơn "GL_INVALID_OPERATION"? Đó là một chút rắc rối để thiết lập, nhưng hoàn toàn xứng đáng với nó. – postgoodism

+0

+1 để chia sẻ ví dụ về chương trình OpenGL nhỏ nhất có thể đơn giản nhất cho Go – ANisus

+0

Thật công bằng, nó không thực sự là "chương trình OpenGL đơn giản nhất có thể nhỏ nhất cho Go", công bằng ... người ta có thể cắt giảm ;) – metaleap

Trả lời

14

Bạn không tạo/ràng buộc một Vertex Array Object với glGenVertexArrays()glBindVertexArray(). VAO đóng gói một loạt trạng thái thuộc tính đỉnh, bao gồm các thuộc tính được bật, thông tin chi tiết theo từng thuộc tính, v.v. Chúng là tùy chọn khi tính năng ban đầu được giới thiệu, nhưng giờ đây chúng được yêu cầu trong bối cảnh nghiêm ngặt/cốt lõi theo phần 10.4 của the OpenGL core specification :

Lỗi INVALID_OPERATION được tạo bởi bất kỳ lệnh nào sửa đổi, vẽ từ hoặc truy vấn mảng đỉnh khi không có mảng đỉnh bị ràng buộc. Điều này xảy ra ở trạng thái GL ban đầu và có thể xảy ra do BindVertexArray hoặc tác dụng phụ của DeleteVertexArrays.

Dưới đây là một ví dụ rất thô như thế nào VAOs được sử dụng:

// At initialization time: 
GLuint vao = 0; 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 
// Set up your vertex attribute state: 
// - glBindBuffer(GL_ARRAY_BUFFER,...); 
// - glEnableVertexAttribArray(...); 
// - glVertexAttribPointer(...); 
// - etc. -- Refer to OpenGL docs to see what is/isn't included in the VAO! 
glBindVertexArray(0); // unbinds vao 

// At draw time: 
glBindVertexArray(vao); // automatically sets up previously-bound vertex attribute state 
glDrawArrays(...); 
glBindVertexArray(0); // unbinds vao 
+0

Chà, tôi tìm hiểu thêm về câu trả lời của bạn và những gì bạn đang nói thực sự có vẻ là trường hợp ... sẽ thử và báo cáo lại! – metaleap

+0

Và bạn đã đúng! Đó là nó. Sẽ dính vào hồ sơ cốt lõi từ bây giờ trong quá trình phát triển để nắm bắt những điều như vậy trước đó. – metaleap

+0

Tuyệt vời! Những gì tôi muốn thấy là một số tài liệu OpenGL chính thức (chứ không phải là bài đăng trên diễn đàn/SE) xác nhận sự khác biệt này (và những thứ khác) giữa khả năng tương thích và ngữ cảnh GL cốt lõi, nhưng cho đến nay tôi vẫn chưa tìm được. – postgoodism

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