opengl es中绘制图形总结

//初始化棋盘格
void DrawChecker::Init()
{
    //顶点着色器1 棋盘格
    char vShaderStr_1[] =
            "#version 300 es                          \n"  //着色器版本
            "layout(location = 0) in vec4 a_position;  \n"  //声明输入属性数组 名为vPosition的四分量
            "layout(location = 1) in vec2 a_texCoord;   \n"
            "out vec2 v_texCoord;                       \n"
            "uniform mat4 u_MVPMatrix_1;\n"
            "void main()                              \n"  //声明main,表示着色器执行开始
            "{                                        \n"
            "   gl_Position = u_MVPMatrix_1 * a_position;\n" //将输入属性(vPosition*u_MVPMatrix)赋值给gl_Position的特殊输出变量
//            "   v_texCoord = a_texCoord;                \n"
            "   v_texCoord = vec2(a_texCoord.x,a_texCoord.y);                \n"
            "}                                        \n"; //每个顶点着色器必须在gl_Position变量中输出一个位置;这个变量定义传递到管线下一个阶段的位置

    //用于普通渲染的片段着色器1 棋盘格
    char fShaderStr_1[] =
            "#version 300 es                              \n"  //着色版本
            "precision mediump float;                     \n"  //声明着色器中浮点数的默认精度
            "in vec2 v_texCoord;\n"
            "layout(location = 0) out vec4 outColor;                          \n"  //一个4分量的输出变量 写入这个变量的值将被输出到颜色缓存区
            "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); //创建着色器程序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);//该函数用于将m_ImageTextureId所代表的纹理对象绑定到OpenGL的纹理单元上
    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]); //该函数用于将m_RenderImages[2]中的数据传递给纹理对象
    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,        // TexCoord 0
            0.0f,  1.0f,        // TexCoord 1
            1.0f,  1.0f,        // TexCoord 2
            1.0f,  0.0f         // TexCoord 3
    };

    GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
    glVertexAttribPointer (0, 3, GL_FLOAT,
                           GL_FALSE, 3 * sizeof (GLfloat), verticesCoords);
    // Load the texture coordinate
    glVertexAttribPointer (1, 2, GL_FLOAT,
                           GL_FALSE, 2 * sizeof (GLfloat), textureCoords);

    glEnableVertexAttribArray (0);
    glEnableVertexAttribArray (1);
    glUseProgram (m_ProgramObj_1);

    glActiveTexture(GL_TEXTURE0); //激活纹理单元 GL_TEXTURE0
    glBindTexture(GL_TEXTURE_2D, m_ImageTextureId); //绑定到当前激活的纹理单元

    m_MVPMatrix_1=InitiParam(); //视图投影矩阵:将模型的顶点坐标从3D空间中投影到2D屏幕上
    glUniform1i(m_SamplerLoc, 0);

    glm::mat4 aebLocation = glm::mat4(1.0f);
    aebLocation = glm::translate(aebLocation, glm::vec3(0.0f, 0.0f, -60.0f)); //平移矩阵的作用是将模型沿着z轴负方向移动60个单位
    glm::mat4 m_MVPMatrix_9=m_MVPMatrix_1*aebLocation;
    glUniformMatrix4fv(m_MVPMatLoc_1, 1, GL_FALSE, &m_MVPMatrix_9[0][0]); //传递矩阵数据到着色器程序中的 m_MVPMatLoc_1 uniform变量,可以将变换矩阵应用到所有的顶点上,从而实现模型的变换和渲染

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);

}

```cpp
以上代码是完成图片的绘制
1.设置顶点坐标和纹理坐标
2.将顶点坐标和纹理坐标指定顶点属性,并启用这些顶点属性
3.激活着色器
4.激活纹理,并绑定
5.设置着色器中输入变量
6.绘制函数绘制
注:若使用vbo和vao,则可以把1,2放在init中,否则只能放在draw中
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL ES 2.0 绘制基本图形需要创建一个顶点数组并将其传递给着色器进行渲染。以下是绘制基本图形的一些示例代码: 1. 绘制三角形 ```c++ GLfloat vertices[] = { -0.5f, -0.5f, 0.0f, // 左下角 0.5f, -0.5f, 0.0f, // 右下角 0.0f, 0.5f, 0.0f // 顶部 }; glVertexAttribPointer(positionAttribLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices); glEnableVertexAttribArray(positionAttribLocation); glDrawArrays(GL_TRIANGLES, 0, 3); ``` 2. 绘制矩形 ```c++ GLfloat vertices[] = { -0.5f, -0.5f, 0.0f, // 左下角 0.5f, -0.5f, 0.0f, // 右下角 0.5f, 0.5f, 0.0f, // 右上角 -0.5f, 0.5f, 0.0f // 左上角 }; glVertexAttribPointer(positionAttribLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices); glEnableVertexAttribArray(positionAttribLocation); GLuint indices[] = { 0, 1, 2, 0, 2, 3 }; glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, indices); ``` 3. 绘制圆形 ```c++ const int segments = 30; // 圆形的分段数 GLfloat vertices[(segments + 1) * 3]; for (int i = 0; i <= segments; i++) { float angle = 2.0f * M_PI * static_cast<float>(i) / static_cast<float>(segments); vertices[i * 3] = cosf(angle); vertices[i * 3 + 1] = sinf(angle); vertices[i * 3 + 2] = 0.0f; } glVertexAttribPointer(positionAttribLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices); glEnableVertexAttribArray(positionAttribLocation); glDrawArrays(GL_TRIANGLE_FAN, 0, segments + 1); ``` 以上代码,`positionAttribLocation` 是顶点着色器位置变量的位置。`glVertexAttribPointer` 函数将顶点数据传递给着色器。`glEnableVertexAttribArray` 函数启用顶点属性数组。`glDrawArrays` 函数使用传递的数据绘制图形。 对于矩形,我们使用了索引缓冲对象 (`GLuint indices[]`) 来指定顶点的顺序。`GL_TRIANGLE_FAN` 参数指定绘制圆形时使用的绘制模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值