zoukankan      html  css  js  c++  java
  • 编译链接着色器程序,进行绘制

    三角形的绘制实现类。

    //
    // 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 坐标系中三角形顶点坐标:

  • 相关阅读:
    UVA 10617 Again Palindrome
    UVA 10154 Weights and Measures
    UVA 10201 Adventures in Moving Part IV
    UVA 10313 Pay the Price
    UVA 10271 Chopsticks
    Restore DB後設置指引 for maximo
    每行SQL語句加go換行
    种服务器角色所拥有的权限
    Framework X support IPV6?
    模擬DeadLock
  • 原文地址:https://www.cnblogs.com/ly570/p/11535805.html
Copyright © 2011-2022 走看看