Chương 5: Áp dụng OpenGLES để tạo ứng dụng 3D trên Andro
5.6 Chiều sâu (Depth):
Để thêm chiều sâu vào chương trình, sử dụng lời gọi làm depth buffer. depth buffer có chứa một giá trị cho mỗi điểm ảnh trên màn hình, giá trị này trong khoảng từ
0 đến 1. Điều này đại diện cho khoảng cách từ đối tượng đến người xem, mỗi sự đồng bộ có sự liên kết sâu về giá trị. Khi hai giá trị chiều sâu được so sánh thì giá trị thấp hơn sẽ được hiển thị trên màn hình.
Thực hiện: Bước đầu tiên là phải bật chức năng depth buffer, điều này được thực hiện thông qua cờ GL_DEPTH_TEST trong hàm glEnable.
gl.glEnable (GL10.GL_DEPTH_TEST);
Có thể thay đổi chiều sâu bằng cách sử dụng hàm glDepthFunc, hàm này chỉ định giá trị trong depth buffer để so sánh. Các giá trị này được mô tả qua bảng sau:
Cờ Mô tả
GL_NEVER Không bao giờ đi qua
GL_LESS Đi qua nếu giá trị chiều sâu đưa vào nhỏ hơn giá trị được lưutrữ GL_EQUAL Đi qua nếu giá trị chiều sâu đưa vào bằng giá trị được lưu trữ GL_LEQUAL Đi qua nếu giá trị chiều sâu đưa vào nhỏ hơn hoặc bằng giá
GL_GREATER Đi qua nếu giá trị chiều sâu đưa vào lớn giá trị được lưu trữ GL_NOTEQUAL Đi qua nếu giá trị chiều sâu đưa vào không bằng giá trị đượclưu trữ GL_GEQUAL Đi qua nếu giá trị chiều sâu đưa vào lớn hơn hoặc bằng giá
trị được lưu trữ GL_ALWAYS Luôn đi qua
Giá trị cờ mặc định là GL_LESS, khi thử đi qua khi các giá trị bằng nhau thì sẽ xảy ra các đối tượng có cùng các giá trị z, màn hình sẽ hiển thị tùy thuộc vào thứ tự mà đối tượng đó được in ra.
gl.glDepthFunc(GL10.GL_LEQUAL); gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
Khi thử chiều sâu để so sánh các giá trị, phải khởi tạo tất cả các giá trị trong bộ đệm. Điều này có thể đạt được bằng cách sử dụng hàm glClearDepthf, hàm này sẽ đưa ra một trong những tham số chỉ ra giá trị về chiều sâu trong bộ đệm dùng để khởi tạo cùng.
gl.glClearDepthf(1.0f);
Ví dụ: hiển thị một số hình tam giác trên màn hình làm việc với depth buffer gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangle);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colors);
gl.glEnableClientState (GL10.GL_VERTEX_ARRAY); gl.glEnableClientState (GL10.GL_COLOR_ARRAY);
public void display(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity ();
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
Vẽ tam giác thứ 2 hơi ở trên tam giác đầu tiên gl.glPushMatrix();
gl.glTranslatef(-0.2f, 0.0f, -1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0,3);
Tam giác thứ 3 quay 45 độ theo trục z của tam giác thứ 2 gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0,3); gl.glPopMatrix();
Cuối cùng là tam giác đặt cùng với trục z với tam giác đầu tiên, đây là hình tam giác nhỏ nằm ở phía bên phải.
gl.glPushMatrix(); gl.glTranslatef(0.5f, 0.0f, 0.0f); gl.glScalef(0.5f, 0.5f, 0.5f); gl.glDrawArrays(GL10.GL_TRIANGLES, 0,3); gl.glPopMatrix(); gl.glFlush (); gl.glFinish (); } Kết quả:
Hình 20 – Kết quả chiều sâu