2010-05-06 24 views
11

Giả sử bạn có một cái gì đó như thế này:Hành vi đúng khi cả kết cấu 1D và 2D bị ràng buộc trong OpenGL là gì?

glBindTexture(GL_TEXTURE_2D, my2dTex); 
glBindTexture(GL_TEXTURE_1D, my1dTex); 
glBegin... 

hành vi OpenGL đúng là gì? Để vẽ kết cấu 1d, 2d hoặc cả hai? Đối với mỗi kết cấu hoạt động có thực sự nhiều kết cấu có thể được ràng buộc với nó cùng một lúc (tức là 1d, 2d, bản đồ khối lập phương 3d, v.v ...) không?

Trả lời

13

Trạng thái GL cho các liên kết là một tên kết cấu cho mỗi mục tiêu (ví dụ: 1D/2D/3D/cube). Vì vậy, khi gọi

glBindTexture(GL_TEXTURE_2D, my2dTex) 
glBindTexture(GL_TEXTURE_1D, my1dTex) 

GL sẽ nhớ cả hai cài đặt.

Bây giờ, câu trả lời trong đó một GL sẽ sử dụng tùy thuộc vào việc bạn có trình đổ bóng hay không.

Nếu trình đổ bóng được bật, GL sẽ sử dụng bất kỳ trình đổ bóng nào nói để sử dụng. (dựa trên sampler1d/sampler2d ...).

Nếu không có bóng đổ, thì trước tiên phụ thuộc vào cuộc gọi có thể thực hiện được.

glEnable(GL_TEXTURE_2D) 
glEnable(GL_TEXTURE_1D) 

Nếu cả được kích hoạt, có một quy tắc ưu tiên tĩnh trong spec (3.8.15 Texture ứng dụng trong spec GL 1.5).

Cube > 3D > 2D > 1D 

Vì vậy, trong trường hợp của bạn, nếu cả hai mục tiêu kết cấu của bạn được bật, mục 2D sẽ được sử dụng.

Như một mặt lưu ý, chú ý cách một Shader không quan tâm hay không mục tiêu kết cấu đã được kích hoạt ...

Chỉnh sửa để thêm:

Và đối với những người thực sự muốn có được đối với các chi tiết gớm ghiếc, bạn luôn luôn có kết cấu được ràng buộc cho mỗi mục tiêu * mỗi đơn vị. Tên 0 (mặc định cho trạng thái liên kết) tương ứng với một loạt các đối tượng kết cấu, một đối tượng cho mỗi mục tiêu. glBindTexture(GL_TEXTURE_2D, 0)glBindTexture(GL_TEXTURE_1D, 0) đều gắn kết một kết cấu, nhưng không giống nhau ...

Đây là lịch sử, được chỉ định để khớp với hành vi của GL 1.0, nơi đối tượng kết cấu chưa tồn tại. Tôi không chắc chắn những gì các phản đối trong GL3.0 đã làm với điều này, mặc dù.

0

Tôi nghĩ rằng kết cấu 1d sẽ được vẽ. Theo như tôi biết, mỗi đơn vị kết cấu chỉ có thể có một kết cấu bị ràng buộc tại một thời điểm. Số lượng các kích thước của kết cấu không thực sự đi vào nó.

Để có nhiều hơn một kết cấu ràng buộc bạn phải kích hoạt nhiều hơn một đơn vị kết cấu (sử dụng glActiveTexture), như thế này:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, my2dTex); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_1D, my1dTex); 

này xuất phát từ sự hiểu biết của tôi về OpenGL 2.1 mặc dù, vì vậy hãy sửa lại cho tôi nếu họ đã giới thiệu một số phần mở rộng kết cấu mới lạ mắt trong một phiên bản sau!

+0

Xin lỗi, bạn nghĩ sai. Bahbar cung cấp câu trả lời đúng. – Thomas

+0

Vâng, tôi đã học được điều gì đó mới mẻ hôm nay. Điều đó sẽ dạy tôi trả lời khi tôi không có cuốn sách OpenGL của tôi tiện dụng! –

0

Kết cấu được áp dụng là kết cấu được chỉ định cuối cùng với thường trình BindTexture.

Từ đặc điểm kỹ thuật:

Đối tượng kết cấu mới ràng buộc để mục tiêu là, và vẫn còn là một kết cấu của các chiều và gõ theo quy định của mục tiêu cho đến khi nó bị xóa. .... Nếu liên kết thành công thì không có thay đổi nào được thực hiện đối với trạng thái đối tượng kết cấu bị ràng buộc, và mọi liên kết trước đó với mục tiêu bị hỏng.

Thực tế trong ví dụ của bạn, nó sẽ được áp dụng kết cấu 1D vì nó "ghi đè lên" trạng thái của đơn vị kết cấu đang hoạt động.

+1

mục tiêu từ ở đây đề cập đến _1D hoặc _2D. có 2 mục tiêu khác nhau liên quan trong trường hợp này. – Bahbar

+1

'GL_TEXTURE_1D' và' GL_TEXTURE_2D' là các mục tiêu khác nhau. – Thomas

+0

Ok, tôi đã nhận nó * sau khi * đọc câu trả lời của Bahbar (bỏ qua trước khi chỉnh sửa!). Điểm tốt. Luôn luôn tha thứ cho mô hình Bật/Tắt vì sử dụng ngôn ngữ luôn tô bóng ... – Luca

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