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ự?
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
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
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