2012-05-23 24 views
5

Tôi có một ứng dụng Android sử dụng OpenGL ES 2.0. Tôi cần vẽ 10 dòng từ một mảng, mỗi dòng được mô tả bằng điểm bắt đầu và điểm kết thúc. Vì vậy, có 10 dòng = 20 điểm = 60 giá trị nổi. Không có điểm nào được kết nối sao cho mỗi cặp điểm trong mảng không liên quan đến các điểm khác, do đó tôi vẽ bằng GL_LINES.Làm cách nào để sử dụng trình đổ bóng cho các đường màu được vẽ bằng GL_LINES và OpenGL ES 2.0

tôi vẽ chúng bằng cách đặt các giá trị vào một bộ đệm phao và kêu gọi một số mã helper như thế này:

public void drawLines(FloatBuffer vertexBuffer, float lineWidth, 
     int numPoints, float colour[]) { 
    GLES20.glLineWidth(lineWidth); 
    drawShape(vertexBuffer, GLES20.GL_LINES, numPoints, colour); 
} 

protected void drawShape(FloatBuffer vertexBuffer, int drawType, 
     int numPoints, float colour[]) { 
    // ... set shader ... 
    GLES20.glDrawArrays(drawType, 0, numPoints); 
} 

Các drawLines mất bộ đệm phao (60 phao), một độ rộng vạch phổ, số điểm (20) và một mảng giá trị màu nổi 4. Tôi đã không hiển thị mã thiết lập shader nhưng về cơ bản nó cho thấy biến màu sắc với giá trị uColour thống nhất.

Trình đổ bóng phân đoạn chọn lên uColour chỉ cắm thẳng vào đầu ra.

/* Fragment */ 
precision mediump float; 

uniform vec4 uColour; 
uniform float uTime; 

void main() { 
    gl_FragColor = uColour; 
} 

Các vertex:

uniform mat4 uMVPMatrix; 

attribute vec4 vPosition; 

void main() { 
    gl_Position = uMVPMatrix * vPosition; 
} 

Nhưng bây giờ tôi muốn làm điều gì đó khác nhau. Tôi muốn mọi dòng trong bộ đệm của tôi có màu khác nhau. Màu sắc là một hàm của vị trí của dòng trong mảng. Tôi muốn tô bóng màu trắng của dòng bắt đầu, màu xám đậm cuối cùng và các đường thẳng giữa một mức độ chuyển đổi giữa hai màu, ví dụ: #ffffff, #eeeeee, #dddddd, v.v.

Tôi rõ ràng có thể vẽ từng dòng riêng lẻ khi cắm giá trị mới vào uColour mỗi lần nhưng điều đó không hiệu quả. Tôi không muốn gọi GL 10 lần khi tôi có thể gọi nó một lần và sửa đổi giá trị trong một shader mỗi lần xung quanh.

Có lẽ tôi có thể khai báo giá trị thống nhất được gọi là uVertexCount trong trình đổ bóng đỉnh của tôi? Trước khi vẽ, tôi đặt uVertexCount thành 0 và mỗi lần đổ bóng đỉnh được gọi là tôi tăng giá trị này. Trình đổ bóng phân đoạn có thể xác định chỉ mục dòng bằng cách xem uVertexCount. Sau đó nó có thể nội suy một giá trị cho màu sắc giữa một số giá trị bắt đầu và kết thúc hoặc một số phương tiện khác. Nhưng điều này phụ thuộc nếu mọi dòng hoặc điểm được coi là nguyên thủy hoặc toàn bộ các dòng là một nguyên thủy duy nhất.

Điều này có khả thi không? Tôi không biết bao nhiêu lần đổ bóng đỉnh được gọi cho mỗi phần đổ bóng. Các cuộc gọi được xen kẽ theo cách như thế này để làm cho nó khả thi, tức là đỉnh 0, đỉnh 1, x * đoạn, đỉnh 2, đỉnh 3, x * đoạn, v.v.

Có ai biết một số mã mẫu hợp lý không có thể chứng minh khái niệm hoặc chỉ cho tôi một số cách khác để làm một cái gì đó tương tự?

+0

Tại sao không sử dụng màu sắc như một thuộc tính? Thêm thông tin màu vào VertexBuffer của bạn. – pearcoding

+0

Tôi có thể thêm nó dưới dạng thuộc tính nhưng tôi vẫn cần biết chỉ mục điểm/đường trong trình đổ bóng phân đoạn để biết màu nào của thuộc tính mà tôi nên sử dụng. tức là nếu tôi chuyển một mảng gồm 10 màu như một thuộc tính, thì trình đổ bóng phân đoạn của tôi biết cái nào trong số 10 màu đó sẽ được sử dụng? – locka

+0

không được thực hiện tự động ...bạn cần chỉ mục nếu bạn có một mảng đồng nhất, nhưng không phải khi bạn có thuộc tính. Một thuộc tính chỉ được kết nối với một đỉnh. Vì vậy, mỗi đỉnh của bạn có một vị trí và một màu sắc. – pearcoding

Trả lời

6

Thêm thông tin màu vào Vertexbuffer (Floatbuffer) và sử dụng thuộc tính trong trình đổ bóng của bạn.

Ví dụ vertexbuffer:

uniform mat4 uMVPMatrix; 

attribute vec4 vPosition; 
attribute vec3 vColor; 

varying vec3 color; 

void main() { 
    gl_Position = uMVPMatrix * vPosition; 
    color = vColor; 
} 

Ví dụ fragmentshader:

precision mediump float; 

varying vec3 color; 

void main() { 
    gl_FragColor = color; 
} 
+0

Bạn có gợi ý tôi sử dụng glDrawElements thay vì glDrawArray ở đây theo một cách nào đó để đẩy vColor vào trình đổ bóng vector không? Liệu màu sắc có bị xâm phạm hay bất cứ thứ gì từ điều này hay tôi phải cung cấp cùng một màu cho điểm bắt đầu/kết thúc để đảm bảo giá trị thay đổi không thay đổi? Tôi sẽ cố gắng và cho đi một đêm nay để xem tôi tiếp tục như thế nào. – locka

+2

Tôi nghĩ rằng tôi đã có nó ngay bây giờ. Tôi phải liên kết glVertexAttribPointer/glEnableVertexAttribArray với một mảng float cho màu sắc. Tôi có thể phải tăng gấp đôi màu sắc cho mỗi đầu của dòng nhưng điều đó phải đủ đơn giản. Tôi sẽ đăng một bản cập nhật khi tôi nhận được một nơi nào đó với điều này. – locka

+0

+1 Có điều này là đúng cách: D – pearcoding

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