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而不是三角形