Line Strip
上一篇文章畫了兩條線段,但是用了4個點。如果幾條線段首尾相接的話,可以讓OpenGL把他們當成Line Strip來畫,這樣就可以用n+1個點來畫n條線段。
代碼
import java.nio.ByteBuffer
import java.nio.ByteOrder
import javax.media.opengl.GL
def vertexShaderCode = """
attribute vec4 a_Position;
void main() {
gl_Position = a_Position;
gl_PointSize = 10.0;
}
"""
def fragmentShaderCode = """
precision mediump float;
void main() {
gl_FragColor = vec4(1.0, 0.5, 0.0, 1.0);
}
"""
def shaderProgram = glob.compileAndLink(vertexShaderCode, fragmentShaderCode)
def aPositionLocation = gl.glGetAttribLocation(shaderProgram.objectId, "a_Position")
shaderProgram.use()
def BYTES_PER_FLOAT = 4
def POSITION_ELEMENT_COUNT = 2
def POINT_COUNT = 4
def vertices = [
-0.2f,-0.8f,
-0.2f,-0.2f,
0.0f, 0.0f,
0.2f,-0.6f,
] as float[]
def vertexData = ByteBuffer
.allocateDirect(vertices.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer()
vertexData.put(vertices)
vertexData.position(0)
gl.glVertexAttribPointer(aPositionLocation,
POSITION_ELEMENT_COUNT, gl.GL_FLOAT, false, 0, vertexData)
gl.glEnableVertexAttribArray(aPositionLocation)
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f)
gl.glClear(gl.GL_COLOR_BUFFER_BIT)
gl.glLineWidth(4)
gl.glDrawArrays(gl.GL_LINE_STRIP, 0, POINT_COUNT)
唯一有必要說明的就是這段代碼:
gl.glDrawArrays(gl.GL_LINE_STRIP, 0, POINT_COUNT)
傳入的參數是 GL_LINE_STRIP而不是 GL_LINES。
效果
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc5WOHJVeWdkWwJ0MVZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TN2IjM0YTN4ETOwATMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
Line Loop
如果Line Strip閉合的話,那麼就變成了Line Loop。修改上面的腳本,把傳遞給glDrawArrays()方法的GL_LINE_STRIP參數改成GL_LINE_LOOP:
gl.glDrawArrays(gl.GL_LINE_LOOP, 0, POINT_COUNT)