use smoothstep interpolation for simple line shader

testing with one vertexAttribArray, this should be faster for switching polgon/line shaders
This commit is contained in:
Hannes Janetzek 2013-01-17 12:07:27 +01:00
parent 3c990b3289
commit 62bc122930

View File

@ -76,8 +76,8 @@ public final class LineRenderer {
hLineWidth[i] = glGetUniformLocation(lineProgram[i], "u_width"); hLineWidth[i] = glGetUniformLocation(lineProgram[i], "u_width");
hLineColor[i] = glGetUniformLocation(lineProgram[i], "u_color"); hLineColor[i] = glGetUniformLocation(lineProgram[i], "u_color");
hLineMode[i] = glGetUniformLocation(lineProgram[i], "u_mode"); hLineMode[i] = glGetUniformLocation(lineProgram[i], "u_mode");
hLineVertexPosition[i] = glGetAttribLocation(lineProgram[i], "a_position"); hLineVertexPosition[i] = glGetAttribLocation(lineProgram[i], "a_pos");
hLineTexturePosition[i] = glGetAttribLocation(lineProgram[i], "a_st"); //hLineTexturePosition[i] = glGetAttribLocation(lineProgram[i], "a_st");
} }
return true; return true;
} }
@ -98,13 +98,13 @@ public final class LineRenderer {
int uLineColor = hLineColor[mode]; int uLineColor = hLineColor[mode];
int uLineWidth = hLineWidth[mode]; int uLineWidth = hLineWidth[mode];
GLState.enableVertexArrays(hLineVertexPosition[mode], hLineTexturePosition[mode]); GLState.enableVertexArrays(hLineVertexPosition[mode], -1); // hLineTexturePosition[mode]);
glVertexAttribPointer(hLineVertexPosition[mode], 2, GL_SHORT, glVertexAttribPointer(hLineVertexPosition[mode], 4, GL_SHORT,
false, 8, bufferOffset + LINE_VERTICES_DATA_POS_OFFSET); false, 0, bufferOffset + LINE_VERTICES_DATA_POS_OFFSET);
glVertexAttribPointer(hLineTexturePosition[mode], 2, GL_SHORT, // glVertexAttribPointer(hLineTexturePosition[mode], 2, GL_SHORT,
false, 8, bufferOffset + LINE_VERTICES_DATA_TEX_OFFSET); // false, 8, bufferOffset + LINE_VERTICES_DATA_TEX_OFFSET);
glUniformMatrix4fv(hLineMatrix[mode], 1, false, matrix, 0); glUniformMatrix4fv(hLineMatrix[mode], 1, false, matrix, 0);
@ -217,19 +217,20 @@ public final class LineRenderer {
+ "precision mediump float;" + "precision mediump float;"
+ "uniform mat4 u_mvp;" + "uniform mat4 u_mvp;"
+ "uniform float u_width;" + "uniform float u_width;"
+ "attribute vec2 a_position;" + "attribute vec4 a_pos;"
+ "attribute vec2 a_st;" + "uniform int u_mode;"
//+ "attribute vec2 a_st;"
+ "varying vec2 v_st;" + "varying vec2 v_st;"
+ "const float dscale = 8.0/2048.0;" + "const float dscale = 8.0/2048.0;"
+ "void main() {" + "void main() {"
// scale extrusion to u_width pixel // scale extrusion to u_width pixel
// just ignore the two most insignificant bits of a_st :) // just ignore the two most insignificant bits of a_st :)
+ " vec2 dir = dscale * u_width * a_st;" + " vec2 dir = dscale * u_width * a_pos.zw;"
+ " gl_Position = u_mvp * vec4(a_position + dir, 0.0,1.0);" + " gl_Position = u_mvp * vec4(a_pos.xy + dir, 0.0, 1.0);"
// last two bits of a_st hold the texture coordinates // last two bits of a_st hold the texture coordinates
+ " v_st = u_width * (abs(mod(a_st,4.0)) - 1.0);" + " v_st = u_width * (abs(mod(a_pos.zw,4.0)) - 1.0);"
// use bit operations when available (gles 1.3) // use bit operations when available (gles 1.3)
// + " v_st = u_width * vec2(ivec2(a_st) & 3 - 1);" // + " v_st = u_width * vec2(a_st.x & 3 - 1, a_st.y & 3 - 1);"
+ "}"; + "}";
private final static String lineSimpleFragmentShader = "" private final static String lineSimpleFragmentShader = ""
@ -247,9 +248,11 @@ public final class LineRenderer {
+ " len = u_width - length(v_st);" + " len = u_width - length(v_st);"
// fade to alpha. u_wscale is the width in pixel which should be // fade to alpha. u_wscale is the width in pixel which should be
// faded, u_width - len the position of this fragment on the // faded, u_width - len the position of this fragment on the
// perpendicular to this line segment, only works with no // perpendicular to this line segment. this only works with no
// perspective // perspective
+ " gl_FragColor = u_color * min(1.0, len / u_wscale);" //+ " gl_FragColor = u_color * min(1.0, len / u_wscale);"
+ " gl_FragColor = u_color * smoothstep(0.0, u_wscale, len);"
+ "}"; + "}";
private final static String lineFragmentShader = "" private final static String lineFragmentShader = ""