opengl shader实现Bezier曲线

opengl shader实现Bezier曲线

顶点着色器

const char *BezierVertexShaderSource =
"#version 330 core                                                                                              \n"
"layout (location = 0) in float t;                                                                        \n"
"uniform mat4 World;                                                                                            \n"
"uniform mat4 View;                                                                                             \n"
"uniform mat4 Projection;                                                                                       \n"
"void main()                                                                                                    \n"
"{                                                                                                              \n"
"vec4 Position;"
"vec4 p0 = vec4(-0.5, -0.5, 0,0);"
"vec4 p1 = vec4(-0.25,-0.25, 0,0);"
"vec4 p2 = vec4(0.25, -0.25, 0,0);"
"vec4 p3 = vec4(0.5, -0.5, 0,0);"
"Position.x = pow((1- t), 3)*p0.x + 3 * (t)*pow((1 - t), 2)*p1.x + 3 * pow((t), 2)*(1 - t)*p2.x + pow((t), 3)*p3.x;"
"Position.y = pow((1- t), 3)*p0.y + 3 * (t)*pow((1- t), 2)*p1.y+ 3 * pow((t), 2)*(1 - t)*p2.y + pow((t), 3)*p3.y;"
"Position.z = 0;"
"Position.w=1.0;"
//"    FragPos= vec3(World * Position);                                                                           \n"
"    gl_Position =Projection * View * World * Position;                                                         \n"
"}                                                                                                              \0";

片段着色器

//GLSL(OpenGL Shading Language)编写片段着色器
const char *BezierFragmentShaderSource =
"#version 330 core                                                                                              \n"
"out vec4 FragColor;                                                                                            \n"
"void main()                                                                                                    \n"
"{                                                                                                              \n"
"    FragColor = vec4(1.0,0,0,1.0);                                                                             \n"
"}                                                                                                              \0";


向shader传递数据

int CreateBezierShader()
{
    
    
    glDeleteBuffers(1, &m_nEBO);
    glDeleteBuffers(1, &m_nVBO);
    glDeleteVertexArrays(1, &m_nVAO);
    m_nVAO = 0;
    m_nVBO = 0;
    m_nEBO = 0;
    int n = glGetError();
    float *pTdata = new float[100];
    for (int i = 0; i < 100; i++)
    {
    
    
        pTdata[i] = i*1.0f / 100.0f;
    }

    //创建顶点缓冲
    glGenVertexArrays(1, &m_nVAO);

    //顶点未创建
    if (0 == m_nVAO)
    {
    
    
        return FAIL;
    }
    //绑定VAO
    glBindVertexArray(m_nVAO);
    //创建VBO bufer
    glGenBuffers(1, &m_nVBO);
    //Buffer未成功创建
    if (0 == m_nVBO)
    {
    
    
        return FAIL;
    }
    glGenBuffers(1, &m_nEBO);
    //绑定VBO,传入顶点数据
    glBindBuffer(GL_ARRAY_BUFFER, m_nVBO);
    n = sizeof(VERTICES);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float)*100, &pTdata[0], GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_nEBO);
    //glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(long)*nVertexCount, &pnIndices[0], GL_STATIC_DRAW);

    glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE,  sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);

    glBindVertexArray(0);
    if (nullptr != pTdata)
    {
    
    
        delete [] pTdata;
        pTdata = nullptr;
    }
    return SUCCESS;
}

注意绘制的时候要选择画线GL_LINES而不是三角形

猜你喜欢

转载自blog.csdn.net/weixin_44478077/article/details/128560308