2012-02-20 31 views
6

Tôi đang viết một trò chơi OpenGL ES 2.0 (trên iOS). Làm thế nào tôi có thể tạo ra một shader (vì tôi giả định này sẽ được đơn giản để làm trong một shader) để hình học xa hơn từ nguồn gốc (trên trục Z) xuất hiện tối hơn?Làm cách nào để tô màu mọi thứ trong OpenGL ES 2.0 dựa trên chiều sâu của chúng?

Nước trong hình ảnh này cho thấy ảnh hưởng tôi có trong tâm trí

Zarch http://www.bytecellar.com/wp-content/uploads/2010/12/Zarch_screen.png

+0

Có lẽ bạn nên tìm kiếm ánh sáng Open GL ES 2.0. – Lordalcol

Trả lời

8

Đây là khá đơn giản để làm gì nếu bạn chỉ muốn sử dụng vị trí Z của hình học của bạn. Bạn có thể có một vertex shader như sau:

attribute vec4 position; 

varying float zDepth; 

uniform mat4 modelViewProjMatrix; 

void main() 
{ 
    vec4 newPosition = modelViewProjMatrix * position; 
    gl_Position = newPosition; 
    zDepth = (2.0 - (1.0 + newPosition.z))/2.0; 
} 

và một Shader đoạn như

varying highp float zDepth; 

void main() 
{ 
    gl_FragColor = vec4(zDepth, zDepth, 0.0, 1.0); 
} 

mà sẽ tạo ra giao diện sau:

Depth-shaded OpenGL teapot

Tôi có một ví dụ về điều này trong vòng this iPad sample code Tôi đã lắp ráp cho lớp OpenGL ES 2.0 của mình.

+0

Điều đó hoạt động tốt, đặc biệt nếu bạn kết hợp màu của các đối tượng. '2.0' trong mã cần thay đổi bất kỳ độ sâu z nào của bạn. – Piku

0

Tôi đã làm một bài kiểm tra khá thú vị với những gì @brad cung cấp. Tôi chỉ thay đổi dòng:

gl_FragColor = vec4(1.0, 1.0, 0.0, zDepth); 

Không có gì xảy ra với alpha. Có phải là tôi hoặc có cái gì khác bị thiếu như đối với Alpha?

+0

Hoặc hầu hết các giá trị độ sâu của bạn thực sự gần với một hoặc GL_BLEND bị vô hiệu hóa, cũng như glBlendFunc không được đặt. –

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