Option 1 for fixing android 4.4

Reinit vertex attribute pointer each time, performance may hurt
This commit is contained in:
Benau 2017-07-09 00:46:42 +08:00
parent 7b185ce2f1
commit 8653d410f8
2 changed files with 12 additions and 46 deletions

View File

@ -6,11 +6,11 @@ uniform vec2 texsize;
#ifdef Explicit_Attrib_Location_Usable
layout(location=0) in vec2 Position;
layout(location=3) in vec2 Texcoord;
layout(location=2) in uvec4 Color;
layout(location=2) in vec4 Color;
#else
in vec2 Position;
in vec2 Texcoord;
in uvec4 Color;
in vec4 Color;
#endif
out vec2 uv;
@ -18,7 +18,7 @@ out vec4 col;
void main()
{
col = vec4(Color) / 255.;
col = Color.zyxw;
uv = Texcoord * texsize + texcenter;
gl_Position = vec4(Position * size + center, 0., 1.);
}

View File

@ -93,41 +93,12 @@ class ColoredTextureRectShader : public TextureShader<ColoredTextureRectShader,
core::vector2df, core::vector2df,
core::vector2df, core::vector2df>
{
#ifdef XX
private:
GLuint m_quad_buffer;
void initQuadBuffer()
{
const float quad_vertex[] = { -1., -1., -1., 1., // UpperLeft
-1., 1., -1., -1., // LowerLeft
1., -1., 1., 1., // UpperRight
1., 1., 1., -1. }; // LowerRight
glGenBuffers(1, &m_quad_buffer);
glBindBuffer(GL_ARRAY_BUFFER, m_quad_buffer);
glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(float), quad_vertex,
GL_STATIC_DRAW);
glGenVertexArrays(1, &SharedObject::UIVAO);
glBindVertexArray(SharedObject::UIVAO);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(3);
glBindBuffer(GL_ARRAY_BUFFER, m_quad_buffer);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float),
(GLvoid *)(2 * sizeof(float)));
glBindVertexArray(0);
} // initQuadBuffer
#endif
public:
GLuint m_color_vbo;
GLuint m_vao;
ColoredTextureRectShader()
{
#ifdef XX
initQuadBuffer();
#endif
loadProgram(OBJECT, GL_VERTEX_SHADER, "colortexturedquad.vert",
GL_FRAGMENT_SHADER, "colortexturedquad.frag");
assignUniforms("center", "size", "texcenter", "texsize");
@ -143,16 +114,15 @@ public:
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float),
(GLvoid *)(2 * sizeof(float)));
const unsigned quad_color[] = { 0, 0, 0, 255,
glBindVertexArray(0);
const uint8_t quad_color[] = { 0, 0, 0, 255,
255, 0, 0, 255,
0, 255, 0, 255,
0, 0, 255, 255 };
glGenBuffers(1, &m_color_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_color_vbo);
glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(unsigned), quad_color,
GL_DYNAMIC_DRAW);
glVertexAttribIPointer(2, 4, GL_UNSIGNED_INT, 4 * sizeof(unsigned), 0);
glBindVertexArray(0);
glBufferData(GL_ARRAY_BUFFER, 16, quad_color, GL_DYNAMIC_DRAW);
} // ColoredTextureRectShader
}; // ColoredTextureRectShader
@ -164,16 +134,11 @@ static void drawTexColoredQuad(const video::ITexture *texture,
float tex_center_pos_y, float tex_width,
float tex_height)
{
unsigned colors[] = {
col[0].getRed(), col[0].getGreen(), col[0].getBlue(), col[0].getAlpha(),
col[1].getRed(), col[1].getGreen(), col[1].getBlue(), col[1].getAlpha(),
col[2].getRed(), col[2].getGreen(), col[2].getBlue(), col[2].getAlpha(),
col[3].getRed(), col[3].getGreen(), col[3].getBlue(), col[3].getAlpha(),
};
glBindVertexArray(ColoredTextureRectShader::getInstance()->m_vao);
glBindBuffer(GL_ARRAY_BUFFER,
ColoredTextureRectShader::getInstance()->m_color_vbo);
glBufferSubData(GL_ARRAY_BUFFER, 0, 16 * sizeof(unsigned), colors);
glBufferSubData(GL_ARRAY_BUFFER, 0, 16, col);
glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, 4 , 0);
ColoredTextureRectShader::getInstance()->use();
glBindVertexArray(ColoredTextureRectShader::getInstance()->m_vao);
@ -186,8 +151,9 @@ static void drawTexColoredQuad(const video::ITexture *texture,
core::vector2df(tex_width, tex_height));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
glGetError();
} // drawTexColoredQuad