void DrawChecker::Init()
{
char vShaderStr_1[] =
"#version 300 es \n"
"layout(location = 0) in vec4 a_position; \n"
"layout(location = 1) in vec2 a_texCoord; \n"
"out vec2 v_texCoord; \n"
"uniform mat4 u_MVPMatrix_1;\n"
"void main() \n"
"{ \n"
" gl_Position = u_MVPMatrix_1 * a_position;\n"
" v_texCoord = vec2(a_texCoord.x,a_texCoord.y); \n"
"} \n";
char fShaderStr_1[] =
"#version 300 es \n"
"precision mediump float; \n"
"in vec2 v_texCoord;\n"
"layout(location = 0) out vec4 outColor; \n"
"uniform sampler2D s_TextureMap;\n"
"void main()\n"
"{\n"
" outColor = texture(s_TextureMap, v_texCoord)* vec4(0.0,1.0,1.0,0.0);\n"
"}";
m_ProgramObj_1 = GLUtils::CreateProgram(vShaderStr_1, fShaderStr_1, m_VertexShader_1, m_FragmentShader_1);
m_MVPMatLoc_1 = glGetUniformLocation(m_ProgramObj_1, "u_MVPMatrix_1");
m_SamplerLoc = glGetUniformLocation(m_ProgramObj_1, "s_TextureMap");
glGenTextures(1, &m_ImageTextureId);
glBindTexture(GL_TEXTURE_2D, m_ImageTextureId);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_RenderImages[2].width, m_RenderImages[2].height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, m_RenderImages[2].ppPlane[0]);
glBindTexture(GL_TEXTURE_2D, GL_NONE);
}
以上代码是传入一张图片的初始化:
1.设置顶点着色器和片段着色器
2.链接顶点着色器和片段着色器成m_ProgramObj_1 ,再对顶点着色器中需要输入的数值设置接口。
3.纹理生成,绑定以及把得到的图片数据绑定进去。
上面纹理中绑定的图片数据来源:
void DrawChecker::LoadMultiImageWithIndex(int index, NativeImage *pImage)
{
if (pImage)
{
m_RenderImages[index].width = pImage->width;
m_RenderImages[index].height = pImage->height;
m_RenderImages[index].format = pImage->format;
NativeImageUtil::CopyNativeImage(pImage, &m_RenderImages[index]);
}
}
void DrawChecker::Draw(int screenW, int screenH)
{
if(m_ProgramObj_1 == GL_NONE ) return;
glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0, 0.0, 0.0, 0.0);
ofstream out("/sdcard/opengl_log.txt", ios::app);
GLfloat verticesCoords[] = {
-0.5f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.5f, 0.0f, 0.0f,
};
GLfloat textureCoords[] = {
0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f
};
GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
glVertexAttribPointer (0, 3, GL_FLOAT,
GL_FALSE, 3 * sizeof (GLfloat), verticesCoords);
glVertexAttribPointer (1, 2, GL_FLOAT,
GL_FALSE, 2 * sizeof (GLfloat), textureCoords);
glEnableVertexAttribArray (0);
glEnableVertexAttribArray (1);
glUseProgram (m_ProgramObj_1);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_ImageTextureId);
m_MVPMatrix_1=InitiParam();
glUniform1i(m_SamplerLoc, 0);
glm::mat4 aebLocation = glm::mat4(1.0f);
aebLocation = glm::translate(aebLocation, glm::vec3(0.0f, 0.0f, -60.0f));
glm::mat4 m_MVPMatrix_9=m_MVPMatrix_1*aebLocation;
glUniformMatrix4fv(m_MVPMatLoc_1, 1, GL_FALSE, &m_MVPMatrix_9[0][0]);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
}
```cpp
以上代码是完成图片的绘制
1.设置顶点坐标和纹理坐标
2.将顶点坐标和纹理坐标指定顶点属性,并启用这些顶点属性
3.激活着色器
4.激活纹理,并绑定
5.设置着色器中输入变量
6.绘制函数绘制
注:若使用vbo和vao,则可以把1,2放在init中,否则只能放在draw中