2011-02-11 31 views
9

Có 3 nền trong hình dưới đây: đen trắng & xámĐiều gì sẽ gây ra sự khác biệt giữa alpha và Windows XP giữa Windows và OS X?

có 3 quầy bar trên mỗi một: đen -> minh bạch, trắng -> minh bạch, và màu sắc -> minh bạch

Tôi đang sử dụng glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); và tất cả các màu đỉnh của tôi là 1,1,1,0.

Lỗi này thực sự hiển thị trong trắng-> trong suốt trên nền trắng.

Trên Windows XP (và các cửa sổ khác có hương vị), nó hoạt động hoàn hảo và tôi hoàn toàn trắng. Trên Mac tuy nhiên, tôi nhận được màu xám ở giữa!

Điều gì sẽ gây ra điều này và tại sao nó sẽ tối hơn khi tôi pha trộn màu trắng trên nền trắng?

kích thước

Ảnh chụp màn hình đầy đủ là @http://dl.dropbox.com/u/9410632/mac-colorbad.png

Screenshot

thông tin Cập nhật:

Trên Windows, nó không có vẻ quan trọng về phiên bản OpenGL. 2,0 đến 3,2, tất cả công việc. Trên máy Mac, tôi đã có mặt trước tôi, đó là 2.1.

Độ dốc được giữ trong họa tiết và tất cả các đỉnh được tô màu 1,1,1,1 (rgb trắng, alpha đầy đủ). Các hình nền chỉ là kết cấu 1x1 pixel (được tạo bản đồ với các gradient) và các đỉnh được tô màu khi cần, với alpha đầy đủ.

Tập bản đồ được tạo với glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, data); Nó xuất phát từ tệp dds ARGB mà tôi tự sáng tác.

Tôi cũng nên lưu ý rằng tất cả mọi thứ được vẽ bằng một Shader trivally đơn giản:

 
uniform sampler2D tex1; 
uniform float alpha; 

void main() { 
    gl_FragColor = gl_Color * texture2D(tex1, gl_TexCoord[0].st) * vec4(1.0, 1.0, 1.0, alpha); 
} 

đồng phục alpha được thiết lập để 1,0

Bây giờ, tôi đã cố gắng thay đổi nó để gradient trắng không một kết cấu, nhưng chỉ 4 đỉnh nơi những cái bên trái có màu trắng và đục, và những cái bên phải là 1,1,1,0, và nó hoạt động!

Tôi đã kiểm tra kết cấu gấp ba lần ngay bây giờ, và nó chỉ có màu trắng, với các thay đổi alpha 1.0-> 0.0.

Tôi nghĩ đây có thể là vấn đề mặc định. Phiên bản của opengl hoặc trình điều khiển có thể khởi tạo mọi thứ khác nhau.

Ví dụ, gần đây tôi thấy rằng mọi người đều có GL_TEXTURE_2D glEnabled theo mặc định, nhưng không phải là Intel GME965.

SOLUTION FOUND

Thứ nhất, nền hơn một chút. Chương trình này thực sự được viết bằng .NET (sử dụng Mono trên OS X) và tệp DDS tôi đang viết là một tập bản đồ được tạo tự động bằng cách nén một thư mục các tệp PNG 24 bit thành kết cấu nhỏ nhất có thể. Tôi đang tải những PNG đó bằng cách sử dụng System.Drawing.Bitmap và hiển thị chúng thành một Bitmap lớn hơn sau khi xác định bố cục. Bitmap sau bố cục đó sau đó bị khóa (để lấy nó ở các byte của nó), và chúng được ghi ra một DDS theo mã tôi đã viết.

Khi đọc tư vấn của Bahbar, tôi đã kiểm tra kết cấu trong bộ nhớ và chúng thực sự khác! DDS của tôi được tải có vẻ là thủ phạm chứ không phải bất kỳ cài đặt OpenGL nào. Trên một linh cảm ngày hôm nay, tôi đã kiểm tra các tập tin DDS chính nó trên hai nền tảng (sử dụng một byte để so sánh byte), và thực sự, họ đã khác nhau! Khi tôi tải lên các tệp DDS bằng WTV (http://developer.nvidia.com/object/windows_texture_viewer.html), chúng trông giống hệt nhau. Tuy nhiên, khi sử dụng WTV, bạn có thể tắt từng kênh (R G B A). Khi tôi bật tắt kênh Alpha, trên cửa sổ tôi thấy một hình ảnh thực sự xấu. Không có alpha sẽ dẫn đến không có cạnh antialiased, do đó, tất nhiên nó sẽ trông khủng khiếp. Khi tôi tắt kênh alpha trên OSX DDS, nó trông ổn!

Trình tải PNG trong Mono là khởi tạo trước, gây ra tất cả sự cố của tôi. Tôi đã nhập một vé cho họ (https://bugzilla.novell.com/show_bug.cgi?id=679242) và đã chuyển sang sử dụng trực tiếp libpng.

Cảm ơn tất cả mọi người!

+0

định dạng bề mặt hiển thị là gì? đặc biệt về SRGB? Màu trắng trên nền trắng đã khiến tôi bối rối. – Bahbar

+1

Các thanh có được vẽ bằng kết cấu hay sử dụng phép nội suy màu không? – rotoglup

+0

các đỉnh nào là 1,1,1,0? ngay cả nền đen, trắng, xám? –

Trả lời

1

Kiểm tra trình tải dds của bạn. Nó có thể được thực hiện trước khi nhân lên mà John Bartholomew đang nói về tải, chỉ trên một nền tảng.

Cách dễ dàng để xác minh cũng là xem xét dữ liệu khi dữ liệu đang được tải vào kết cấu, trên cuộc gọi glTexImage. Dữ liệu đó có hoàn toàn đồng bộ không?

+0

ok, tôi đã tìm thấy sự cố và bạn đã đóng đinh nó. –

2

Đây là một chút đâm trong bóng tối, nhưng hãy kiểm tra (hoặc đặt rõ ràng) các chế độ chuyển pixel.

Kết quả bạn nhận được trông giống như kết quả bạn mong đợi nếu bạn đang sử dụng kết cấu có alpha được nhân trước nhưng sau đó sử dụng chế độ hòa trộn bạn đã đặt. Một cái gì đó có thể đã thiết lập các chế độ chuyển pixel để nhân alpha vào các kênh màu khi kết cấu được tải lên.

Bạn cũng có thể kiểm tra xem kết quả Mac có chính xác không (với họa tiết) khi bạn đặt chế độ hòa trộn thành glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA).

+0

Đây là một DDS không nén, và tôi tải nó bằng cách sử: 'glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, dữ liệu); ' Tôi không premultiplying nó .. Tôi chỉ cần đọc tệp DDS từ đĩa và chuyển phần không phải tiêu đề đến cuộc gọi ở trên. Cuộc gọi OpenGL nào sẽ tác động đến mức tải có khả năng xảy ra sớm như thế nào? –

+0

Tôi in ra giá trị của GL _ * _ SCALE và GL _ * _ BIAS và chúng đều giống nhau trên các cửa sổ và mac (1 cho các vảy, 0 cho độ lệch), vì vậy không phải vậy. Khi tôi sử dụng GL_ONE blendmode thay vì GL_SRC_ALPHA, tôi thấy màu trắng chính xác, nhưng sau đó tất cả các lớp phủ tối của tôi bị vỡ. –

+0

Có (hoặc có thể, tùy thuộc vào phiên bản opengl và phần mở rộng) một ma trận màu được áp dụng trong quá trình chuyển pixel. Hãy thử xóa nó bằng 'glMatrixMode (GL_COLOR); glLoadIdentity(); ' –