2011-06-21 26 views
17

Tôi có các đỉnh đổ bóng và các phần đổ bóng.Mối quan hệ giữa gl_Color và gl_FrontColor trong cả hai loại đổ bóng và đỉnh là gì?

vertex

void main(void) 
{ 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
} 

fragment shader

void main(void) 
{ 
    gl_FragColor = gl_Color; 
} 

Những tạo dựng hình trống (màu đen không màu nền như glClearBuffer không).

Nếu tôi sửa đổi đổ bóng đỉnh để đặt gl_FrontColor thành gl_Color, nó sẽ làm cho bộ đệm OpenGl bị ảnh hưởng ... với hành vi mong đợi của các trình đổ bóng thông qua.

void main(void) 
{ 
    gl_FrontColor = gl_Color; //Added line 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
} 

Tôi nhầm lẫn, cách cài đặt gl_FrontColor trong trình đổ bóng đỉnh có thể thay đổi giá trị của gl_Color trong đoạn một? Những gì tôi đang mất tích?

Trả lời

32

gl_Color có nghĩa là những thứ khác nhau ở những nơi khác nhau.

Trong trình đổ bóng đỉnh, gl_Color thể hiện thuộc tính màu cho mỗi đỉnh chính được người dùng chuyển. Điều này được đặt bằng cách sử dụng glColor* cuộc gọi hoặc dữ liệu mảng được tìm nạp theo glColorPointer.

Trong trình đổ bóng phân đoạn, gl_Color đại diện cho màu nội suy cho khuôn mặt của tam giác được hiển thị. Hãy nhớ rằng hình tam giác có mặt trước và mặt sau. Nếu bạn bật tính năng hủy khuôn mặt thì tất cả các khuôn mặt của một loại hoặc loại khác (hoặc cả hai) sẽ không được hiển thị. Tuy nhiên, nếu bạn tắt cắt mặt, thì cả hai mặt sẽ được hiển thị.

Thường hữu ích khi có các giá trị đầu ra trên mỗi đỉnh khác nhau dựa trên mặt cụ thể của hình tam giác. Màu chính có màu phía trước và màu sau, biểu thị màu cho hình tam giác mặt trước và hình tam giác quay mặt về phía sau. Kết quả đầu ra của đổ bóng đỉnh cho các giá trị này là gl_FrontColorgl_BackColor.

Nếu bạn đang thực hiện hiển thị hai mặt, bạn sẽ cần phải đặt cả hai giá trị này để đầu vào gl_Color của trình tạo phân đoạn có ý nghĩa gì. Nếu bạn chỉ thực hiện dựng hình mặt trước, thì bạn chỉ cần đặt gl_FrontColor.

+0

Đó là một lời giải thích tốt đẹp! – vrince

0

gl_Color là Màu bạn đã chuyển trong nguồn của bạn đến các đỉnh, do đó, nó là một thuộc tính. gl_FrontColor (và cũng là BackColor) là các biến đổi mà thiết lập gl_Color trong fragmentshader tùy thuộc vào bên nào của nguyên thủy bạn nhìn thấy. Vì vậy, nếu bạn thấy gl_Color phía trước sẽ bằng gl_FrontColor ...

+3

Bằng cách các trình tối ưu hóa pixel nằm trong DirectX. OpenGL gọi chúng là FragmentShaders cũng chính xác hơn. – Nobody

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