• 编译链接着色器程序,进行绘制


    三角形的绘制实现类。

    //
    // Created by ByteFlow on 2019/7/9.
    //

    #include "TriangleSample.h"
    #include "../util/GLUtils.h"
    #include "../util/LogUtil.h"

    TriangleSample::TriangleSample()
    {

    }

    TriangleSample::~TriangleSample()
    {
    if (m_ProgramObj)
    {
    glDeleteProgram(m_ProgramObj);
    }

    }

    void TriangleSample::Init()
    {
    char vShaderStr[] =
    "#version 300 es "
    "layout(location = 0) in vec4 vPosition; "
    "void main() "
    "{ "
    " gl_Position = vPosition; "
    "} ";

    char fShaderStr[] =
    "#version 300 es "
    "precision mediump float; "
    "out vec4 fragColor; "
    "void main() "
    "{ "
    " fragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 ); "
    "} ";

    m_ProgramObj = GLUtils::CreateProgram(vShaderStr, fShaderStr, m_VertexShader, m_FragmentShader);

    }

    void TriangleSample::Draw()
    {
    LOGCATE("TriangleSample::Draw");
    GLfloat vVertices[] = {
    0.0f, 0.5f, 0.0f,
    -0.5f, -0.5f, 0.0f,
    0.5f, -0.5f, 0.0f,
    };

    if(m_ProgramObj == 0)
    return;

    // Use the program object
    glUseProgram (m_ProgramObj);

    // Load the vertex data
    glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
    glEnableVertexAttribArray (0);

    glDrawArrays (GL_TRIANGLES, 0, 3);

    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    编译和链接着色器程序的类

    #include "GLUtils.h"
    #include "LogUtil.h"
    #include <stdlib.h>

    GLuint GLUtils::LoadShader(GLenum shaderType, const char *pSource)
    {
    GLuint shader = 0;
    shader = glCreateShader(shaderType);
    if (shader)
    {
    glShaderSource(shader, 1, &pSource, NULL);
    glCompileShader(shader);
    GLint compiled = 0;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    if (!compiled)
    {
    GLint infoLen = 0;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
    if (infoLen)
    {
    char* buf = (char*) malloc((size_t)infoLen);
    if (buf)
    {
    glGetShaderInfoLog(shader, infoLen, NULL, buf);
    LOGCATE("GLUtils::LoadShader Could not compile shader %d: %s ", shaderType, buf);
    free(buf);
    }
    glDeleteShader(shader);
    shader = 0;
    }
    }
    }
    return shader;
    }

    GLuint GLUtils::CreateProgram(const char *pVertexShaderSource, const char *pFragShaderSource, GLuint &vertexShaderHandle, GLuint &fragShaderHandle)
    {
    GLuint program = 0;
    vertexShaderHandle = LoadShader(GL_VERTEX_SHADER, pVertexShaderSource);
    if (!vertexShaderHandle) return program;

    fragShaderHandle = LoadShader(GL_FRAGMENT_SHADER, pFragShaderSource);
    if (!fragShaderHandle) return program;

    program = glCreateProgram();
    if (program)
    {
    glAttachShader(program, vertexShaderHandle);
    CheckGLError("glAttachShader");
    glAttachShader(program, fragShaderHandle);
    CheckGLError("glAttachShader");
    glLinkProgram(program);
    GLint linkStatus = GL_FALSE;
    glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);

    glDetachShader(program, vertexShaderHandle);
    glDeleteShader(vertexShaderHandle);
    vertexShaderHandle = 0;
    glDetachShader(program, fragShaderHandle);
    glDeleteShader(fragShaderHandle);
    fragShaderHandle = 0;
    if (linkStatus != GL_TRUE)
    {
    GLint bufLength = 0;
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
    if (bufLength)
    {
    char* buf = (char*) malloc((size_t)bufLength);
    if (buf)
    {
    glGetProgramInfoLog(program, bufLength, NULL, buf);
    LOGCATE("GLUtils::CreateProgram Could not link program: %s ", buf);
    free(buf);
    }
    }
    glDeleteProgram(program);
    program = 0;
    }
    }
    LOGCATE("GLUtils::CreateProgram program = %d", program);
    return program;
    }

    void GLUtils::DeleteProgram(GLuint &program)
    {
    LOGCATE("GLUtils::DeleteProgram");
    if (program)
    {
    glUseProgram(0);
    glDeleteProgram(program);
    program = 0;
    }
    }

    void GLUtils::CheckGLError(const char *pGLOperation)
    {
    for (GLint error = glGetError(); error; error = glGetError())
    {
    LOGCATE("GLUtils::CheckGLError GL Operation %s() glError (0x%x) ", pGLOperation, error);
    }

    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    在 Init 函数中实现编译链接着色器程序 m_ProgramObj ,其中顶点着色器脚本:

    #version 300 es
    layout(location = 0) in vec4 vPosition;
    void main()
    {
    gl_Position = vPosition;
    }
    1
    2
    3
    4
    5
    6
    片元着色器脚本:

    #version 300 es
    precision mediump float;
    out vec4 fragColor;
    void main()
    {
    fragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 ); //填充三角形区域为红色
    }
    1
    2
    3
    4
    5
    6
    7
    在 Draw 函数中指定着色器程序,为着色器程序中的变量赋值,传入顶点坐标信息,然后绘制三角形。

    opengles 坐标系中三角形顶点坐标:

  • 相关阅读:
    汉诺塔
    给出一个字符串,要求插入最少的字符,使得原字符串为一个回文串
    最长回文子串
    回文数 第N个回文数
    屋子里有1到100号100盏关闭的灯
    无头结点的单链表删除一个中间结点
    单链表逆转
    编程之美2.21 加法
    在一个数组中找 差值最大的两个数 差值最小的两个数 推广到 点对
    斐波那契
  • 原文地址:https://www.cnblogs.com/ly570/p/11535805.html
Copyright © 2020-2023  润新知